到目前为止我一直在使用C#梅森扭转者 http://en.wikipedia.org/wiki/Mersenne_twister在这里找到生成随机数:
http://www.centerspace.net/resources.php http://www.centerspace.net/resources.php
我刚刚发现SFMT http://en.wikipedia.org/wiki/Mersenne_twister#SFMT这里的速度应该是两倍:
http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/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,所以我只关心速度。
这也将运行在带 .NET 2 的 Windows Server 2003 R2 SP2(32 位)盒。处理器是AMD 皓龙 275 http://en.wikipedia.org/wiki/List_of_AMD_Opteron_microprocessors#Opteron_200-series_.22Italy.22_.28E6.2C_90_nm.29(4核).