【发布时间】:2010-11-13 01:51:29
【问题描述】:
到目前为止,我一直在使用此处找到的 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,所以我只关心速度。
这也将在带有 .NET 2 的 Windows Server 2003 R2 SP2(32 位)机器上运行。处理器为 AMD Opteron 275(4 核)。
【问题讨论】:
-
一个 20 位的数字代表 0 到 2^20-1 的范围,2^20 需要 21 位来表示(1 后跟 20 个零)
-
Nifle:不要将生成器的周期(即序列的长度)与您希望随机的间隔混淆数字。
-
@Patrick 谢谢你是正确的 2^20-1 是我需要的,我需要随机索引到长度为 2^20 的数组中。
-
@Nifle 是的,我知道,我问是否有人可以指出我的 SFMT 的 C# 实现。
标签: c# random montecarlo