unity number and c# .net algorithm random

number - random.next c#



¿Es 161803398 un número "especial"? En el interior de Math.Random() (2)

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

Estuve hurgando en el código fuente de BCL hoy, echando un vistazo a cómo algunas de las clases que he usado antes se implementaron realmente. Nunca antes había pensado en cómo generar números (pseudo) 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 de 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 es "a mitad de camino" de un número que parecía más significativo. Lo miré en binario y hexagonal y, bueno, me pareció un número.

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


Este número se toma de la proporción áurea 1,61803398 * 10 ^ 8 . Matt dio una buena respuesta, cuál 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 subtractive de Knuth y los principales puntos son:

  • almacena 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 son 31 aparte
  • nuevo número aleatorio es la diferencia de los dos valores en los dos índices
  • almacenar nuevo número aleatorio en la lista

El generador se basa en la siguiente recursión: X n = (X n-55 - X n-24 ) mod m, donde n & geq; 0. Este es un caso parcial de generador de Fibonacci rezagado : X n = (X nj @ X nk ) 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 code , 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 esto no es en realidad un trabajo de investigación (como afirma Math), esta es solo una tesis de maestría.

A las personas en criptografía les gusta utilizar el número irracional ( pi , e , sqrt(5) ) porque hay una conjetura de que los dígitos de tales números aparecen con la misma frecuencia y, por lo tanto, tienen una alta entropy . Puede encontrar esta pregunta relacionada en stackexchange 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á romperla". Pero los criptógrafos, al ser un grupo paranoico, se muestran escépticos cuando alguien dice: "Usemos este conjunto de constantes. Las xkcd.com/221 ". Entonces, como un 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 una gran cantidad de números, al menos podemos estar más seguros de que no hubo sabotaje.