/ / Generar un número aleatorio no repetido dentro del rango en Java - java, aleatorio, no repetitivo

Genere un número aleatorio no repetido dentro del rango en Java - java, aleatorio, no repetitivo

Quiero generar números aleatorios dentro del rango de 1 a 4, 4 incluidos.
Aquí está mi código:

int num = r.nextInt(4) + 1;  //r is instance of Random.

Sin embargo, estoy ejecutando el código anterior en un bucle y no quiero repetir el número aleatorio. Lo que pasa ahora es que a menudo estoy recibiendo:
1,1,1,2,3,1,4,2,2,1,4,2,4,4,2,1,4,3,3,1,4,2,4,1 como mi salida.

Aquí, aunque los números son aleatorios dentro del rango (1-4), pero a menudo se repiten como el número "1" en las primeras 3 iteraciones.

Lo que busco es una forma de no tenerRepetición de un número aleatorio dentro del bucle. Una forma sencilla que conozco es mantener el último número aleatorio antes de la iteración actual y comparar, pero estoy seguro de que debe haber una mejor solución para esto.
Gracias por adelantado.

Respuestas

6 para la respuesta № 1

Utilizar random.nextInt(range-1) y luego asigne ese número al número de salida con una función que excluye el número anterior:

public class Test {
private final Random random = new Random();
private final int range;
private int previous;

Test(int range) { this.range = range; }

int nextRnd() {
if (previous == 0) return previous = random.nextInt(range) + 1;
final int rnd = random.nextInt(range-1) + 1;
return previous = (rnd < previous? rnd : rnd + 1);
}


public static void main(String[] args) {
final Test t = new Test(4);
for (int i = 0; i < 100; i++) System.out.println(t.nextRnd());
}
}

1 para la respuesta № 2

No hay mejor respuesta. Usted está recibiendo una aleatorio número. Compruebe esta línea:

1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1

esta podría ser perfectamente aleatorio Así que te propongo que describas un requisito mejor. ¿Quieres siempre un número siguiente que sea diferente al anterior? ¿Quieres un máximo de duplicados en un rango especial? digamos que dentro de 6 números consecutivos, ¿se permite que cada número ocurra dos veces?

Si usted trae tal requerimiento podríamos ayudarle. De lo contrario solo podemos decir: lo que ves es realmente aleatorio :)


1 para la respuesta № 3

Como tiene más números de los que tiene que elegir, tiene que repetir algunos números. Todo lo que puedes hacer es minimizar el número de repeticiones inmediatas.

Una forma de hacerlo es usar Collections.shuffle, que te permite tener números en un orden aleatorio, sin repeticiones y hacer esto cada vez. Podrías evitar que el último valor de N se repita.

Para detener la repetición de números consecutivos, puede reducir el rango y usar el módulo.

int n = 0, max = 4;
Random rand = new Random();

for(int i = 0; i < numbers; i++) {
n = (n + rand.nextInt(max-1)) % max;
int numToUse = n + 1;
// use this number.
}

Este trabajo como hay realmente solo max-1 Valores posibles ya que está excluyendo el último valor utilizado.


0 para la respuesta № 4

Aquí hay un algoritmo:

Inicialice una matriz A [4] con los números 1-4. conjuntoun contador Acnt, el tamaño efectivo de A. Inicializar a 4 para i en 1 a longitud (secuencia de salida) Elija un entero aleatorio X de 0 a Acnt -1 guarda una [X] en tu secuencia de salida swap (A [X], A [Acnt - 1]) Acnt-- if (Acnt == 0) Acnt = longitud (A)

Imagina A es una bolsa de bolas con los números 1-4. Cada iteración de su bucle, se elimina una bola. En lugar de eliminar realmente la matriz, que es expenisve, simplemente ocultas la bola al final de la matriz. Cuando disminuyes la cantidad de bolas en la bolsa (Acnt), la siguiente bola que selecciones proviene de las bolas no ocultas.

Cuando ya no tenga que seleccionar más bolas, puede mostrar las bolas reiniciando la cuenta de bolas en su bolsa de nuevo a la cuenta completa.

Este es básicamente el algoritmo shuffle estándar.

Editar: Al releer la pregunta, ahora veo que permitese repite después de solo 1 número en lugar de la secuencia completa, en cuyo caso, todo lo que necesita hacer para modificar esto es cambiar si (Acnt == 0) a if (Acnt == longitud (A) - 1).