c# - usar - Random.Next devuelve siempre los mismos valores
propiedad random c# (4)
Esta pregunta ya tiene una respuesta aquí:
Esto es realmente extraño, y no puedo ver por qué sucede esto. En el ciclo foreach, estoy iterando a través de una colección de clase A, y para cada clase, llamo al método Count()
, donde los números r1
y r2
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 para la primera instancia son 0 y -1, los mismos serán devueltos de las siguientes instancias. Por favor, ¿podría decirme por qué está pasando 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 clase Random
demasiado cerca del tiempo.
Cuando creas un objeto Random
, se siembra con un valor del reloj del sistema. Si crea instancias Random
demasiado cercanas en el tiempo, todas serán sembradas con la misma secuencia aleatoria.
Cree un único objeto Random
y pase su referencia al constructor cuando cree instancias de la clase "a", en lugar de crear un objeto Random
para cada instancia "a".
Está creando una nueva instancia de Random
muy cerca (su ciclo es muy ajustado) por lo que cada instancia está utilizando efectivamente el mismo valor de inicialización.
Un mejor enfoque sería crear una instancia y pasarla a su método Count
.
Usted sabe probablemente este próximo bit, pero lo incluiré aquí para completarlo:
MSDN tiene los detalles sobre esto, pero básicamente su problema es el método Random.Next que está utilizando genera:
Un entero de 32 bits con signo mayor que o igual a minValue y menor que maxValue; es decir, el rango de valores de retorno 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 de inicialización predeterminado. Probablemente desee hacer un muestreo 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.
Use un único generador de números aleatorios estático para todas las instancias de la clase.
class a
{
private static Random rnd;
static a() {
rnd = new Random();
}
private void Count()
{
int r1 = rnd.Next(-1, 2);
int r2 = rnd.Next(-1, 2);
}
}
Tenga en cuenta el cambio para darle números en el rango -1,1 en lugar de -1,0