Sembrando un generador de números pseudoaleatorios en C #

Necesito una semilla para una instancia de la clase Random de C #, y leí que la mayoría de la gente usa el contador de tics del tiempo actual para esto. Pero ese es un valor de 64 bits y la semilla debe ser un valor de 32 bits. Ahora pensé que el método GetHashCode() , que devuelve un int , debería proporcionar un valor razonablemente distribuido para su objeto y esto se puede usar para evitar usar solo los 32 bits más bajos del conteo de tics. Sin embargo, no pude encontrar nada sobre el GetHashCode () del tipo de datos Int64 .

Por lo tanto, sé que no importará mucho, pero lo siguiente funcionará tan bien como creo (no puedo probar la aleatoriedad de error y error), o tal vez funcione igual que usar (int)DateTime.Now.Ticks como la semilla? O tal vez incluso funciona peor? ¿Quién puede arrojar algo de luz sobre esto?

 int seed = unchecked(DateTime.Now.Ticks.GetHashCode()); Random r = new Random(seed); 

Edición: ¿Por qué necesito una semilla y no solo dejar que el constructor Random() haga el trabajo? Necesito enviar la semilla a otros clientes que usan la misma semilla para la misma secuencia aleatoria.

new Random() ya usa la hora actual. Es equivalente a new Random(Environment.TickCount) .

Pero este es un detalle de implementación y podría cambiar en futuras versiones de .net

Recomiendo usar el nuevo Random () y solo proporcionar una semilla fija si desea obtener una secuencia reproducible de valores pseudoaleatorios.

Ya que necesita una semilla conocida solo use Environment.TickCount al igual que MS. Y luego transmitirlo a las otras instancias del progtwig como semilla.

Si crea múltiples instancias de Random en un corto intervalo (podría ser de 16ms), se pueden sembrar al mismo valor y, por lo tanto, crear la misma secuencia pseudo-aleatoria. Pero eso es muy probable que no sea un problema aquí. Este error común se debe a que Windows actualiza la hora actual ( DateTime.Now / .UtcNow ) y TickCount ( Environment.TickCount ) solo cada pocos milisegundos. El intervalo exacto depende de la versión de Windows y de qué otros progtwigs se estén ejecutando. Los intervalos típicos en los que no cambian son 16ms o 1ms.

Si necesita agregar algo diferente a la hora actual (en cuyo caso puede usar el constructor predeterminado), puede usar esto:

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

Tuve una pregunta similar, para seleccionar un conjunto aleatorio de preguntas de una lista más grande de preguntas. Pero cuando uso el tiempo como semilla, da el mismo número aleatorio.

Así que aquí está mi solución.

  int TOTALQ = 7; int NOOFQ = 5; int[] selectedQuestion = new int[TOTALQ]; int[] askQuestion = new int[NOOFQ]; /* Genarae a random number 1 to TOTALQ * - if that number in selectedQuestion array is not o * - Fill askQuestion array with that number * - remove that number from selectedQuestion * - if not re-do that - - while - array is not full. */ for (int i = 0; i < TOTALQ; i++) // fill the array selectedQuestion[i] = 1; int question = 0; int seed = 1; while (question < NOOFQ) { DateTime now1 = new DateTime(); now1 = DateTime.Now; Random rand = new Random(seed+now1.Millisecond); int RandomQuestion = rand.Next(1, TOTALQ); Response.Write("
seed " + seed + " Random number " + RandomQuestion ); if (selectedQuestion[RandomQuestion] != 0) { selectedQuestion[RandomQuestion] = 0; // set that q =0 so not to select askQuestion[question] = selectedQuestion[RandomQuestion]; Response.Write(". Question no " + question + " will be question " + RandomQuestion + " from list " ); question++; } seed++; }