До сих пор я использую C# Mersenne Twister найти здесь для генерации случайных чисел:C# Вихрь Мерсенна реализация генератора случайных целое (SFMT) монте карло моделирование
http://www.centerspace.net/resources.php
Я только что обнаружил SFMT который предполагается, что в два раза быстрее здесь:
http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/SFMT/
Может ли кто-нибудь указать мне на реализацию C# SFMT?
Мои требования - генерировать целое число между (и включая) 0 и 2^20 (1048576).
Мне нужно сделать это триллионов раз в день для моделирования, работающего на 24-часовых часах, поэтому я готов провести дни, настраивая это до совершенства.
В настоящее время я подправили центр Space Вихрь Мерсенна, добавив новый метод, чтобы соответствовать моим требованиям:
public uint Next20()
{
return (uint)(genrand_int32() >> 12);
}
Используя метод genrand_int32()
Я хотел бы, чтобы произвести свою собственную версию, genrand_int20()
, который генерирует целое число между (и включая) 0 и 2^20 для сохранения на приведенном выше смещениях и сдвиге, но я не понимаю математику. Как я могу это сделать?
Также используется uint будет быстрее, чем int, или это всего лишь номер адреса? Потому что мне нужно только до 1048576, меня беспокоит только скорость.
Кроме того, это будет работать на 2003 R2 SP2 (32bit) ящик Windows Server с .NET 2. Процессор является AMD Opteron 275 (4 ядра).
20-разрядное число будет представлять собой диапазон от 0 до 2^20-1 включительно, 2^20 требуется 21 бит для представления (a 1, за которым следует 20 нулей) –
Nifle: не путайте * период * генератора (который является длиной последовательности) с * интервалом *, в котором вы хотите случайные числа. – Joey
@Patrick спасибо, что вы правы 2^20-1 - это то, что мне нужно, мне нужно случайным образом индексировать массив длиной 2^20. – m3ntat