2011-01-20 32 views

Respuesta

9

Simplemente elimine el número de semilla en el constructor. Esta semilla es esencialmente un número a partir del cual se genera la lista de números aleatorios. Si especifica un número constante, su lista de números aleatorios siempre será la misma.

Random rand = new Random(); 
rand.Next(); 
+0

restringirá la cantidad de caracteres generados o puede generar 10000 o 1000000000 – maztt

+0

No creo que haya un límite en la cantidad de números generados. Tampoco está relacionado con un número de caracteres, ya que el método '.Next()' devuelve un entero de 32 bits con signo mayor o igual que cero y menor que MaxValue. –

4
No

seguro exactamente lo que está después!

Random rand = new Random(Environment.TickCount); 
rand.Next(); 
+0

+1 mientras que el tickcount no es una gran semilla, es al menos dinámico y para propósitos generales probablemente * lo suficientemente bueno *. –

+0

En el futuro, sería mejor no intentar responder una pregunta cuando, como dices, no estás seguro de qué es exactamente lo que buscan. – DOK

+0

ok gracias, parece que asumí lo mismo que todos los demás :) – WraithNath

7

especificando la misma semilla intente esto.

Random rand = new Random(); 
rand.Next(); 

Esto usará la semilla predeterminada que es la hora.

"Inicializa una nueva instancia de la clase Aleatoria, utilizando un valor de inicialización predeterminado dependiente del tiempo".

Según MSDN: http://msdn.microsoft.com/en-us/library/system.random.aspx

Re su comentario anterior, la forma de generar un número "aleatorio" en un rango establecido.

// Generate and display 5 random integers from 50 to 100. 
Console.WriteLine("Five random integers between 50 and 100:"); 
Console.Write("{0,8:N0}", rand.Next(50, 101)); 

(Tomado del enlace MSDN anterior) Ahora puede generar el rango que desee.

+0

Existe un problema potencial con el uso de la semilla predeterminada basada en el tiempo. Para una aplicación de varios subprocesos que se ejecuta en un procesador de varios núcleos, es relativamente probable que dos subprocesos diferentes generen exactamente el mismo valor aleatorio (ya que es posible que obtengan la misma hora exacta del sistema y, por lo tanto, produzcan el mismo valor) . Usaría un hash de un Guid.NewGuid() como la semilla en su lugar. – MusiGenesis

+0

Si estaba desarrollando una aplicación así, corrija, sin embargo, el uso de la clase Random() no debería usarse para nada más que hacer que las cosas parezcan aleatorias. – LiamB

+0

La pregunta está etiquetada con "asp.net", que es exactamente el tipo de entorno de subprocesos múltiples que puede producir este tipo de problemas. Dos usuarios que toquen el mismo código al mismo tiempo podrían ver los mismos valores "aleatorios". – LukeH

0
Random rand = new Random(); 
rand.Next(0,1000); // minimum = 0, maximum = 999 
+6

Vale la pena decir que el mínimo es inclusivo, el máximo es exclusivo. Lo anterior generará un número en el rango (inclusivo) 0-999. –

+0

@lain no sabía que ... buen ojo – WernerCD

3
Random rand=new Random(DateTime.Now.Millisecond); 
rand.Next(); 

Esto siempre funciona para mí.

+0

¿Por qué no simplemente 'new Random()', ya que usa 'Environment.TickCount' como el valor predeterminado? – LukeH

+0

@LukeH: ¿tiene alguna documentación sobre eso? Todo lo que he visto documentado es que está sembrado con un valor basado en el tiempo, lo que no necesariamente significa que esté usando 'Environment.TickCount'. – MusiGenesis

+0

@MusiGenesis: Creo que se trata de un detalle de implementación en lugar de una garantía específica, pero es bastante fácil de confirmar por sí mismo usando ILDASM o Reflector. O haciendo algo como 'var r1 = new Random(); var r2 = new Random (Environment.TickCount); while (true) Console.WriteLine (r1.Next() == r2.Next()); 'debe mostrar" verdadero "continuamente a menos que sea * realmente * desafortunado y los dos constructores se ejecuten en cualquier lado de un tic. – LukeH

Cuestiones relacionadas