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