我正在研究一个运行蒙特卡罗模拟的程序; 具体来说,我正在使用Metropolis算法.该程序需要产生数十亿的"随机"数字.我知道梅森捻线机在蒙特卡罗模拟中非常受欢迎,但我想确保以最佳方式播种发电机.
目前我正在使用以下方法计算32位种子:
mt19937_64 prng; //pseudo random number generator
unsigned long seed; //store seed so that every run can follow the same sequence
unsigned char seed_count; //to help keep seeds from repeating because of temporal proximity
unsigned long genSeed() {
return ( static_cast<unsigned long>(time(NULL)) << 16 )
| ( (static_cast<unsigned long>(clock()) & 0xFF) << 8 )
| ( (static_cast<unsigned long>(seed_count++) & 0xFF) );
}
//...
seed = genSeed();
prng.seed(seed);
Run Code Online (Sandbox Code Playgroud)
我有一种感觉,有更好的方法来确保不重复的新种子,我很确定mt19937_64可以播种超过32位.有没有人有什么建议?
我正在寻找一种方法来获得一个在不同机器上运行代码几乎肯定会改变的数字,并且几乎肯定在同一台机器上的两次运行之间保持不变.
如果我在Linux中作为shell脚本执行此操作,我会使用以下内容:
{ uname -n ; cat /proc/meminfo | head -n1 ; cat /proc/cpuinfo ; } | md5sum
Run Code Online (Sandbox Code Playgroud)
但我需要用C++(带升级版),至少在Windows,Linux和Mac上.