visual studio rand number net inclusive generate exclusive csharp c# random clr

studio - random next c# min max



¿Por qué Random.Next() siempre devuelve el mismo número (7)

Dilbert ha encontrado el mismo problema en 2001:

http://dilbert.com/strips/comic/2001-10-25/

¿Coincidencia?

No lo creo.

Y random.org está de acuerdo: http://www.random.org/analysis/

Esta pregunta ya tiene una respuesta aquí:

Considere este método:

private static int GenerateRandomNumber(int seed, int max) { return new Random(seed).Next(max); }

En mi máquina, la ejecución de este bucle produce el mismo número a través de 1500 iteraciones:

for (int i = 0; i < 1501; i++) { int random = GenerateRandomNumber(100000000, 999999999); Console.WriteLine(random.ToString()); Console.ReadKey(); }

Obtengo 145156561, por cada iteración individual.

No tengo un problema acuciante, solo sentía curiosidad por este comportamiento porque .Next (max) dice "Devuelve un número aleatorio no negativo inferior al máximo especificado. Tal vez no entiendo algo básico.


El generador de números pseudoaleatorios generalmente funciona al elegir una semilla y luego generar una secuencia determinística basada en esa semilla. Eligiendo la misma semilla cada vez, generas la misma secuencia.

Hay "solo" 2 ^ 32 secuencias aleatorias diferentes en .NET.


El problema es que está creando una nueva instancia aleatoria con el mismo número de inicialización cada vez. Debe crear una única instancia aleatoria (almacenarla en una estática si es necesario) y simplemente llamar al siguiente método en esa misma instancia.

La generación de números aleatorios no es realmente aleatoria, consulte esta entrada de Wikipedia para obtener más detalles.


En el caso de que alguien busque una "solución rápida y sucia" (y yo uso ese término con precaución), esto será suficiente para la mayoría.

int secondsSinceMidnight = Convert.ToInt32(DateTime.Now.Subtract(DateTime.Today).TotalSeconds); Random rand = new Random(secondsSinceMidnight); var usuallyRandomId = rand.Next();

Por favor, tenga en cuenta mi uso de por lo general al azar. Estoy de acuerdo en que el elemento marcado como la respuesta es una forma más correcta de hacerlo.


No estoy seguro de cómo funcionan las partes internas ... verifique en wiki para eso, pero es muy simple.

public class MathCalculations { private Random rnd = new Random(); public Int32 getRandom(Int32 iMin, Int32 iMax) { return rnd.Next(iMin, iMax); } } public class Main { MathCalculations mathCalculations = new MathCalculations(); for (int i = 0; i < 6; i++) { getRandom(0,1000); } }

generará Number1, Number2, Number3, Number4, Number5, Number6 (1 semilla, 1 secuencia de muchos números, al azar * no realmente, pero aprox. *)

Sin embargo, si haces esto:

public class MathCalculations { public Int32 getRandom(Int32 iMin, Int32 iMax) { Random rnd = new Random(); return rnd.Next(iMin, iMax); } } public class Main { MathCalculations mathCalculations = new MathCalculations(); for (int i = 0; i < 6; i++) { getRandom(0,1000); } }

Ahora obtendrás Number1, Number1, Number1, Number1, Number1, Number1 (1 semilla, 6 secuencias iguales de muchos números, siempre elige el mismo número inicial de cada secuencia igual). En algún punto, Number1 será diferente, porque la semilla cambia con el tiempo ... pero debe esperar un tiempo para esto, sin embargo, nunca elija el número 2 de la secuencia.

La razón es que cada vez que genera una nueva secuencia con la misma semilla, la secuencia es la misma una y otra vez, y cada vez que su aleatorio generado elegirá el primer número en su secuencia, que, con la misma semilla, es por supuesto siempre lo mismo.

No estoy seguro si esto es técnicamente correcto por los métodos subyacentes del generador aleatorio, pero así es como se comporta.


Salam a todos, bueno, eso me volvió loca también. La respuesta es simple. Cambia la semilla antes de generar aleatoriamente.

Ejemplo: quiero generar un número aleatorio entre 1 y 10

Random rnd = new Random(DateTime.Now.Seconds); int random_number = rnd.Next(10);

Ponlo dentro de un bucle y ejecútalo tres veces. Dará números aleatorios por debajo de 10.


Siempre estás sembrando una nueva instancia con la misma semilla y luego agarrando el primer máximo. Al usar una Semilla, estás garantizando los mismos resultados.

Si desea tener una generación de números aleatorios y estática que produzca resultados diferentes, debe volver a trabajar un poco. Sin embargo, dado que Random no es seguro para subprocesos, requiere cierta sincronización cuando se usa estáticamente. Algo como:

private static Random random; private static object syncObj = new object(); private static void InitRandomNumber(int seed) { random = new Random(seed); } private static int GenerateRandomNumber(int max) { lock(syncObj) { if (random == null) random = new Random(); // Or exception... return random.Next(max); } }