¿Es 161803398 un número 'especial'? Dentro de Math.Random ()


162

Sospecho que la respuesta es ' Debido a las matemáticas ', pero esperaba que alguien pudiera dar un poco más de información a un nivel básico ...

Estaba hurgando en el código fuente de BCL hoy, echando un vistazo a cómo se implementaron algunas de las clases que he usado antes. Nunca antes había pensado en cómo generar (pseudo) números aleatorios, así que decidí ver cómo se hacía.

Fuente completa aquí: http://referencesource.microsoft.com/#mscorlib/system/random.cs#29

private const int MSEED = 161803398; 

Este valor MSEED se usa cada vez que se siembra una clase Random ().

De todos modos, vi este 'número mágico' - 161803398 - y no tengo la menor idea de por qué se seleccionó ese número. No es un número primo o una potencia de 2. No está 'a mitad de camino' de un número que parecía más significativo. Lo miré en binario y hexadecimal y bueno, me pareció un número.

Intenté buscar el número en Google, pero no encontré nada.



66
@ 48klocs: lo dice en los documentos :The current implementation of the Random class is based on Donald E. Knuth's subtractive random number generator algorithm. For more information, see D. E. Knuth. "The Art of Computer Programming, volume 2: Seminumerical Algorithms". Addison-Wesley, Reading, MA, second edition, 1981.
Jesse Good

44
@ 48klocs Sí, página 283 aquí: apps.nrbook.com/c/index.html Su razón parece ser "porque las matemáticas".
eshs

22
@eshs: Dato interesante: muestra la página 283 de su enlace inextp = 31;, pero el código fuente de la Randomclase lo tiene inextp = 21;porque alguien lo escribió mal y causó este error .
Jesse Good

77
@Izkata Necesitamos educar a los usuarios sobre el comportamiento correcto (de no votar para cerrar erróneamente) para el objetivo a largo plazo de la calidad del sitio, no solo para el objetivo a corto plazo (de no tener una pregunta específica cerrada). Y si no señalé los comentarios anteriores, podría haberse cerrado como un duplicado porque la gente lo hace a veces.
Bernhard Barker

Respuestas:


141

No, pero se basa en Phi (la "proporción áurea").

161803398 = 1.61803398 * 10^8  φ * 10^8

Más sobre la proporción áurea aquí .

Y una muy buena lectura para el matemático casual aquí .

Y encontré un trabajo de investigación sobre generadores de números aleatorios que está de acuerdo con esta afirmación. (Ver página 53.)


17
¿Sabes por qué un número basado en Phi hace una buena elección como semilla? ¿Sería posible resumir esto aquí?
Bernhard Barker

29
@Dukeling La constante se usa exactamente una vez, para templar la semilla entrante. Mi fuerte sospecha es que fue elegido para ser un número bajo la manga que evita que las semillas con pocos bits establecidos (tal vez una opción común) arruinen el generador de números aleatorios (en lugar de alguna propiedad mágica de phi).
David Eisenstat

77
Para citar una cita de dicho libro Según Knuth, cualquier MBIG grande y cualquier MSEED más pequeño (pero aún grande) puede ser sustituido por los valores anteriores. Por lo tanto, es diversión matemática, más o menos ... Entonces, la respuesta correcta debería ser: No. Pero se basa en Phi.
TaW

14
Solo eché un vistazo a ese papel de números aleatorios - esta línea se destacó un poco - "One can’t even fathom the repercussions if security flaws in the implementation (or design) of the SSL protocol are to be found."(página 4)
jcw

2
Creo que una forma más relevante de usar la proporción áurea sería usar (módulo / phi) en lugar de usar una representación de base 10 de los dígitos en el código que no tiene nada que ver con la base 10. Una característica interesante de phi que Lo que no vi en esa página es que, por lo que puedo decir, para cualquier número entero N, el valor N / phi-int (N / phi)> = 1 / N / sqrt (5). Eso significaría que incluso si uno generara una secuencia de números N / phi-int (N / phi), la distancia entre el par más cercano estará dentro de un factor de sqrt (5) del mayor espaciado uniforme posible en el intervalo ( 0..1)
supercat

62

Este número se toma de la proporción áurea 1.61803398 * 10 ^ 8 . Matt dio una buena respuesta de qué es este número, por lo tanto, solo explicaré un poco sobre un algoritmo.

Este no es un número especial para este algoritmo. El algoritmo es el algoritmo generador de números aleatorios sustractivos de Knuth y sus puntos principales son:

  • almacenar una lista circular de 56 números aleatorios
  • La inicialización es el proceso de llenar la lista, luego aleatorizar esos valores con un algoritmo determinista específico
  • se mantienen dos índices que están separados por 31
  • nuevo número aleatorio es la diferencia de los dos valores en los dos índices
  • almacenar un nuevo número aleatorio en la lista

El generador se basa en la siguiente recursividad: X n = (X n-55 - X n-24 ) mod m, donde n ≥ 0. Este es un caso parcial de generador de Fibonacci rezagado : X n = (X n-j @ X n-k ) mod m, donde 0 <k <j y @ es cualquier operación binaria (resta, suma, xor).

Hay varias implementaciones de este generador. Knuth ofrece una implementación en FORTRAN en su libro. Encontré el siguiente código , con el siguiente comentario:

PARÁMETRO (MBIG = 1000000000, MSEED = 161803398, MZ = 0, FAC = 1.E-9)

Según Knuth, cualquier MBIG grande y cualquier MSEED más pequeño (pero aún grande) se pueden sustituir por los valores anteriores.

Se puede encontrar un poco más aquí. Tenga en cuenta que, en realidad, este no es un trabajo de investigación (como afirma Math), es solo una tesis de maestría.

La gente en la criptografía gusta usar número irracional ( pi, e, sqrt(5)), porque no es una conjetura que los dígitos de un número tan aparece con la misma frecuencia y por lo tanto tienen una alta entropía . Puede encontrar esta pregunta relacionada en el intercambio de pila de seguridad para obtener más información sobre dichos números. Aquí hay una cita:

"Si las constantes se eligen al azar, entonces con alta probabilidad, ningún atacante podrá romperlo". Pero los criptógrafos, siendo un grupo paranoico, se muestran escépticos cuando alguien dice: "Usemos este conjunto de constantes. Los elegí al azar, lo juro ". Entonces, como compromiso, usarán constantes como, por ejemplo, la expansión binaria de π. Si bien ya no tenemos el beneficio matemático de haberlos elegido al azar de un gran conjunto de números, al menos podemos estar más seguros de que no hubo sabotaje.


55
En cuanto al respondedor, no es solo por su entropía, sino también porque esos números se duplican como nada en los números de mi manga .
Cole Johnson
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.