2009-05-26 21 views
11

¿Cómo se generan los números aleatorios? ¿De qué manera los lenguajes como Java, etc. generan números aleatorios, especialmente cómo se hace para los GUID? Encontré que los algoritmos como el generador Pseudorandomnumber usan valores iniciales.¿Cómo generar números "aleatorios" pero también "únicos"?

Pero necesito crear un programa de números aleatorios, en el que un número ocurrido nunca se repite incluso si se reinicia el sistema, etc. Pensé que tenía que guardar los valores en cualquier lugar para poder verificar si el número se repite o no, pero será demasiado complejo cuando la lista vaya más allá de los límites.

+2

¿Desea un generador de GUID? De ser así, proporcione el idioma y el sistema operativo en el que está trabajando. Le diremos cómo usar la biblioteca GUID para su plataforma. –

+0

Duplicado (casi) de http://stackoverflow.com/questions/506118/how-to-manually-generate-random-numbers –

+0

@ S.Lott: ya. Estoy usando VS2005 en Windows XP y C#. @Binary Worrier: lo siento, ya que no encontré esa pregunta stackoverflow al publicar esto. – SyncMaster

Respuesta

18

Primero: Si se garantiza que el número nunca se repetirá, no es muy aleatorio.

Segundo: hay muchos PRNG algorithms.

ACTUALIZACIÓN:

Tercero: Hay un IETF RFC for UUIDs (MS lo llama GUID), pero se debe reconocer que (U | G) UID son no criptográficamente seguro, si eso es una preocupación para usted.

ACTUALIZACIÓN 2:

Si desea utilizar realmente algo como esto en el código de producción (no sólo para su propia edificación) favor utilizar una biblioteca preexistente. Este es el tipo de código que está casi garantizado para tener errores sutiles si nunca lo has hecho antes (o incluso si lo has hecho).

Actualización 3:

Aquí está la docs for .NET's GUID

+0

+1: Creo que eso es todo lo que se cubre, si esto no responde a la pregunta, nada lo hará :) –

+0

Curiosamente, dado que el LCG (http://en.wikipedia.org/wiki/Linear_congruential_generator) es solo sembrado por el valor anterior, creará una secuencia no repetitiva. Es decir, no habrá repeticiones hasta que la secuencia completa se repita. – Sionide21

+1

Un RNG ciertamente puede ser aleatorio si no se repite. Esto simplemente requiere que tenga la misma oportunidad de elegir cualquier número que no haya elegido hasta ahora. – MSalters

0

La mayoría de los generadores de números aleatorios tienen una forma de "aleatorizar" la reinicialización del valor de la semilla. (Algunas veces llamado aleatorizar).

Si eso no es posible, también puede usar el reloj del sistema para inicializar la semilla.

+1

reloj del sistema es una mala idea. si está ejecutando un sitio de póquer, puedo usar el método de prueba y error y calcular fácilmente su semilla en función de las últimas tarjetas y adivinar la diferencia de tiempo entre nuestros relojes. – SillyMonkey

3

Hay un montón de maneras que usted puede generar números aleatorios. Por lo general, se realiza con una llamada de sistema/biblioteca que utiliza un generador de pseudo-números con una semilla como ya se ha descrito.

Pero, hay otras maneras de obtener números aleatorios que involucran hardware especializado para obtener números aleatorios TRUE. Sé de algunos poker sites que usan este tipo de hardware. Es muy interesante leer cómo lo hacen.

+0

¿Presumiblemente esto se basa en observar partículas en descomposición? Maldita sea, ahí va mi próxima media hora. – annakata

+0

heheheheheheheheheheheeh –

+1

Se puede hacer usando un diodo que se mantiene cerca de su rodilla (¿es ese el término en inglés?) Donde es muy inestable y puede cambiar aleatoriamente de pasar corriente a no pasar la corriente. –

0

Específicamente con respecto a Java:

  • java.util.Random utiliza un linear congruential generator, que es not very good
  • java.util.UUID#randomUUID() utiliza java.security.SecureRandom, una interfaz para una variedad de generadores de números aleatorios criptográficamente seguros - el valor por defecto está basado en SHA-1, creo .
  • UUIDs/GUIDs no son necesariamente aleatoria
  • Es fácil encontrar implementaciones de generadores de números aleatorios en la red que son mucho mejores que java.util.Random, como el Mersenne Twister o multiply-with-carry
0

entiendo que usted está buscando una manera de generar número aleatorio usando C#. Si es así, RNGCryptoServiceProvider es lo que está buscando.

[EDIT]

Si genera un tiempo bastante largo número de bytes utilizando RNGCryptoServiceProvider, es probable que sea único, pero no hay gurantee. En teoría, los números aleatorios verdaderos no significan ser únicos. Tira un dado 2 veces y puede obtener la cabeza las dos veces, pero siguen siendo al azar. ¡VERDADERO AL AZAR!

Supongo que para aplicar el control de ser único, solo tiene que implementar su propio mecanismo para mantener el historial de los números generados previamente.

Cuestiones relacionadas