Random.Next devuelve siempre los mismos valores [duplicado]

Resuelto Thomas asked hace 15 años • 4 respuestas

Esto es realmente extraño y no veo por qué sucede. En el ciclo foreach, estoy iterando a través de una colección de clase A, y para cada clase, llamo al Count()método, donde r1y r2los números se generan a partir del rango [-1,1]. El problema es que Random.Nextdevuelve los mismos números "aleatorios" para cada instancia. Cuando los resultados de la primera instancia sean 0 y -1, se devolverán los mismos en las siguientes instancias. Por favor, ¿podría decirme por qué sucede esto? Además, no puedo obtener resultados diferentes en cada instancia de clase A. Este es el código:

class a
{
 Random rnd = new Random();
 private void Count()
 {
  int r1 = rnd.Next(-1, 1);
  int r2 = rnd.Next(-1, 1);
 }
}
class b
{
 List<a> listofA=new list<a>();
 foreach (a ACLASS in listofA)
 {
  ACLASS.Count();
 }
}
Thomas avatar Oct 31 '09 23:10 Thomas
Aceptado

El problema es que estás creando instancias de la Randomclase demasiado cerca en el tiempo.

Cuando crea un Randomobjeto, se le asigna un valor del reloj del sistema. Si crea Randominstancias demasiado cercanas en el tiempo, todas se sembrarán con la misma secuencia aleatoria.

Cree un único Randomobjeto y pase su referencia al constructor cuando cree instancias de la clase "a", en lugar de crear un Randomobjeto para cada instancia "a".

Guffa avatar Oct 31 '2009 16:10 Guffa

Estás creando nuevas instancias Randommuy juntas (tu bucle es muy estrecho), por lo que cada instancia utiliza efectivamente el mismo valor inicial.

Un mejor enfoque sería crear una instancia y pasarla a su Countmétodo.

Probablemente sepas lo siguiente, pero lo incluiré aquí para que esté completo:

MSDN tiene detalles sobre esto, pero básicamente su problema es que el método Random.Next que está utilizando genera:

Un entero de 32 bits con signo mayor o igual que minValue y menor que maxValue; es decir, el rango de valores devueltos incluye minValue pero no maxValue. Si minValue es igual a maxValue, se devuelve minValue.

debido a esto, sus llamadas devolverán -1 o 0.

ChrisF avatar Oct 31 '2009 16:10 ChrisF

Incluye una instancia aleatoria para cada instancia A. Parece que todos obtienen el mismo valor inicial predeterminado. Probablemente desee crear un valor aleatorio estático para todas las instancias A y usarlo repetidamente o, alternativamente, proporcionar un valor inicial a la instancia Random() en el constructor A.

Jherico avatar Oct 31 '2009 16:10 Jherico