小编use*_*315的帖子

如何在不使用C++ 11的情况下使用多个值初始化boost :: mt19937

我可以用:

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++仍然有时会让我感到困惑......

c++ boost

6
推荐指数
2
解决办法
1670
查看次数

如何迭代boost unordered_map?

我只想迭代无序地图的成员.

网上有很多简单的例子,包括在这个网站上,但是没有一个会编译.显然,一些例子来自以前的非标准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)

c++ boost

0
推荐指数
1
解决办法
8214
查看次数

标签 统计

boost ×2

c++ ×2