Cómo sembrar una clase aleatoria para evitar obtener valores aleatorios duplicados

Tengo el siguiente código dentro de un método estático en una clase estática:

Random r = new Random(); int randomNumber = r.Next(1,100); 

Tengo esto dentro de un bucle y sigo obteniendo el mismo randomNumber !

Alguna sugerencia aqui?

No debería crear una nueva instancia Random en un bucle. Pruebe algo como:

 var rnd = new Random(); for(int i = 0; i < 100; ++i) Console.WriteLine(rnd.Next(1, 100)); 

Se supone que la secuencia de números aleatorios generados por una sola instancia Random está distribuida uniformemente. Al crear una nueva instancia Random para cada número aleatorio en sucesiones rápidas, es probable que los siembres con valores idénticos y les generes números aleatorios idénticos. Por supuesto, en este caso, la secuencia generada estará lejos de la distribución uniforme.

Para completar, si realmente necesita resembrar un Random , creará una nueva instancia de Random con el nuevo seed:

 rnd = new Random(newSeed); 

Una buena generación de semillas para mí es:

 Random rand = new Random(Guid.NewGuid().GetHashCode()); 

Es muy aleatorio. La semilla siempre es diferente porque la semilla también se genera al azar.

En caso de que no pueda por alguna razón usar el mismo Random una y otra vez, intente inicializarlo con algo que cambie todo el tiempo, como la hora misma.

 new Random(new System.DateTime().Millisecond).Next(); 

Recuerde que esta es una mala práctica sin embargo.

EDITAR: El constructor predeterminado ya toma su semilla del reloj, y probablemente sea mejor que nosotros. Citando desde MSDN:

Random (): Inicializa una nueva instancia de la clase Random, utilizando un valor de inicialización predeterminado dependiente del tiempo.

El siguiente código es probablemente tu mejor opción:

 new Random().Next(); 

Un poco tarde, pero la implementación utilizada por System.Random es Environment.TickCount :

 public Random() : this(Environment.TickCount) { } 

Esto evita tener que lanzar DateTime.UtcNow.Ticks de un largo, que es arriesgado de todos modos, ya que no representa tics desde el inicio del sistema, sino “el número de intervalos de 100 nanosegundos que han transcurrido desde las 12:00:00 de la medianoche, enero 1, 0001 (0:00:00 UTC del 1 de enero de 0001 en el calendario gregoriano) “.

Estaba buscando una buena semilla entera para el TestApi’s StringFactory.GenerateRandomString

 public static Random rand = new Random(); // this happens once, and will be great at preventing duplicates 

Tenga en cuenta que esto no debe usarse con fines criptográficos.

esto funciona para mí:

 private int GetaRandom() { Thread.Sleep(1); return new Random(DateTime.Now.Millisecond).Next(); } 

Una buena inicialización de semilla se puede hacer así

 Random rnd = new Random((int)DateTime.Now.Ticks); 

Los tics serán únicos y el lanzamiento en un int con probablemente una pérdida de valor estará bien.

Utilizo esto para la mayoría de las situaciones, guardo la semilla si es necesario repetir la secuencia

  var seed = (int) DateTime.Now.Ticks; var random = new Random(seed); 

o

  var random = new Random((int)DateTime.Now.Ticks);