我可以用:
boost::mt19937 gen(43);
Run Code Online (Sandbox Code Playgroud)
这工作得很好,但如果我在使用随机数生成器之前需要超过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());
Run Code Online (Sandbox Code Playgroud)
首先,调用gen2()始终返回相同的值.我不知道我是怎么搞砸的.
其次,我不想要1000个种子,但是当我将它降低到600时,它会"抛出一个std :: invalid_argument的实例,并在调用种子时注释足够的元素"
这种方法可以缩短为少数种子吗?
这是另一个看起来很简单的代码示例:
std::string seedv("thisistheseed");
std::seed_seq q(seedv.begin(),seedv.end());
boost::mt19937 gen2(q);
Run Code Online (Sandbox Code Playgroud)
但它不会编译.我终于发现std :: seed_seq仅在c ++ 11中可用.我坚持使用gcc 4.7,直到我依赖的库是稳定的.
我想我可以坚持使用32位种子,但我想要更多一点.
我读过这篇文章: Boost Mersenne Twister:如何使用多个值种子?
我喜欢初始化整个矢量的想法:
mersenne_twister(seed1) ^ mersenne_twister(seed2)
Run Code Online (Sandbox Code Playgroud)
但是如果不修改Mersenne_Twister.hpp,我就没有办法做到这一点
有什么建议?
更新:还有一种方法不做!
unsigned long seedv[4];
seedv[0]=1;
seedv[1]=2;
seedv[2]=3;
seedv[3]=4;
boost::mt19937 gen2(seedv,4);
Run Code Online (Sandbox Code Playgroud)
使用正确的强制转换,这应该可行,但是我尝试过的每个强制转换都不会超过编译器.我可以使用C语言进行任何操作,但C++仍然有时会让我感到困惑......
我只想迭代无序地图的成员.
网上有很多简单的例子,包括在这个网站上,但是没有一个会编译.显然,一些例子来自以前的非标准STL版本,有些只是旧的,有些是如此新,以至于我的gcc 4.7.2无法处理它们.请不要建议使用C++ 11中的新自动迭代器.有一天,当我的所有库都经过验证时,我会到达那里.在那之前,我只想让旧的工作.(见下面我试过的)
这是我的测试代码:
#include <iostream>
#include <boost/unordered_map.hpp>
#include <string>
int main(int argc,char *argv[]) {
boost::unordered::unordered_map<std::string,int> umap;
//can't get gcc to accept the value_type()...
//umap.insert(boost::unordered_map::value_type("alpha",1));
//umap.insert(boost::unordered_map::value_type("beta",2));
//umap.insert(boost::unordered_map::value_type("gamma",3));
umap["alpha"]=1; //this works
umap["beta"]=2;
umap["gamma"]=3;
//can't get gcc to compile the iterator
//for (boost::unordered_map::iterator it=umap.begin();it!=umap.end();++it)
// std::cout << it->first <<", " << it->second << std::endl;
//gcc does not like it this way either
//for (int x=0;x<umap.size();x++)
// std::cout << x << " : " << umap[x].first << " = " << umap[x].second …Run Code Online (Sandbox Code Playgroud)