Random.Next devuelve siempre los mismos valores [duplicado]
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 r1
y r2
los números se generan a partir del rango [-1,1]. El problema es que Random.Next
devuelve 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();
}
}
El problema es que estás creando instancias de la Random
clase demasiado cerca en el tiempo.
Cuando crea un Random
objeto, se le asigna un valor del reloj del sistema. Si crea Random
instancias demasiado cercanas en el tiempo, todas se sembrarán con la misma secuencia aleatoria.
Cree un único Random
objeto y pase su referencia al constructor cuando cree instancias de la clase "a", en lugar de crear un Random
objeto para cada instancia "a".
Estás creando nuevas instancias Random
muy 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 Count
mé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.
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.