Hasta ahora he estado usando el C# Mersenne Twister encontrado aquí para generar números aleatorios:C# Mersenne Twister entero aleatorio aplicación generador (SFMT) simulación de Monte Carlo
http://www.centerspace.net/resources.php
acabo de descubrir SFMT que es se supone que es el doble de rápido aquí:
http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/SFMT/
¿Alguien puede indicarme una implementación de C# de SFMT?
Mis requisitos son generar un número entero entre (e incluyendo) 0 y 2^20 (1048576).
Necesito hacer esto trillones de veces todos los días para una simulación que se ejecuta en un reloj de 24 horas, así que estoy dispuesto a pasar días ajustando esto a la perfección.
Actualmente lo hemos ajustado el Centro Espacial Mersenne Twister mediante la adición de un nuevo método para adaptarse a mis necesidades:
public uint Next20()
{
return (uint)(genrand_int32() >> 12);
}
Utilizando el método genrand_int32()
Me gustaría producir mi propia versión, genrand_int20()
, que genera una entero entre (e incluido) 0 y 2^20 para guardar en el molde anterior y cambiar pero no entiendo las matemáticas. ¿Exactamente cómo puedo hacer esto?
También está utilizando un uint va a ser más rápido que int, o es solo una cuestión de números direccionables? Como solo necesito hasta 1048576, solo me preocupa la velocidad.
También esto será ejecuta en un 2003 R2 SP2 caja (32 bits) Windows Server con .NET 2. Procesador es AMD Opteron 275 (4 core).
Un número de 20 bits representará el rango de 0 a 2^20-1 incluido, 2^20 requiere 21 bits para representar (un 1 seguido de 20 ceros) –
Nifle: No confunda el * período * del generador (que es la longitud de la secuencia) con un * intervalo * en el que desea números aleatorios. – Joey
@Patrick gracias, está en lo correcto 2^20-1 es lo que necesito, necesito indexar aleatoriamente en una matriz de longitud 2^20. – m3ntat