我可以使用:
boost::mt19937 gen(43);
这个可以正常工作,但是如果我想在使用随机数生成器之前有超过32位的种子,该怎么办?有没有简单的方法将64位或128位种子放入Mersenne Twister中?
我找到了一些加载多个值以生成结果的示例,但是没有一段代码能够正常运行。
这段代码存在一些问题:
std::vector<unsigned int> seedv(1000, 11);
std::vector<unsigned int>::iterator i=seedv.begin();
boost::mt19937 gen2(i, seedv.end());
首先,调用gen2()总是返回相同的值。我不知道我是怎么弄糊涂的。
其次,我不想要1000个种子,但是当我将它降低到600时,它会“抛出一个std::invalid_argument实例,并提示seed调用中没有足够的元素”
这种方法可以缩短为少数几个种子吗?
这里是另一个看起来很简单的代码示例:
std::string seedv("thisistheseed");
std::seed_seq q(seedv.begin(),seedv.end());
boost::mt19937 gen2(q);
但是它无法编译。我最终发现std::seed_seq仅适用于c++11。在我所依赖的库稳定之前,我被困在gcc 4.7中。
我想我只能使用32位种子,但我想要更多一点。
我确实阅读了这篇文章:Boost Mersenne Twister: how to seed with more than one value? 我喜欢从整个向量初始化的想法:
mersenne_twister(seed1) ^ mersenne_twister(seed2)
但我没有看到在不修改Mersenne_Twister.hpp文件的情况下进行操作的方法。
有什么建议吗?
更新:还有一种方法不能实现!
unsigned long seedv[4];
seedv[0]=1;
seedv[1]=2;
seedv[2]=3;
seedv[3]=4;
boost::mt19937 gen2(seedv,4);
如果使用正确的类型转换,这段代码应该可以工作,但是我尝试过的每一种类型转换都无法通过编译器。在C语言中,我可以进行任何类型的转换,但是在C++中有时候仍然会让我感到困惑...
seed_seq
的对象。你可以在这里查看相关资料:seed_seq
。 - T.C.