C++ 合并合并RNG?std::xor_将模板与分发结合起来?

C++ 合并合并RNG?std::xor_将模板与分发结合起来?,c++,random,c++11,C++,Random,C++11,我试图学习C++11随机的东西,所以我从stackoverflow上找到的站点复制了一个例子 我想在这里实现的是使用std::xor_combine模板组合两个引擎并使用第三个引擎初始化它。根据链接abowe,这应该是可能的,但看起来自Tr1报告以来,这里有些事情发生了变化 您还将在代码中使用下面的指数分布对象,因此还有一个问题是如何将xor\u组合对象与分布,以便将“组合”传递到分布操作符() Visual studio给了我一个在下面的代码中描述的错误 #include<iostrea

我试图学习C++11随机的东西,所以我从stackoverflow上找到的站点复制了一个例子

我想在这里实现的是使用std::xor_combine模板组合两个引擎并使用第三个引擎初始化它。根据链接abowe,这应该是可能的,但看起来自Tr1报告以来,这里有些事情发生了变化

您还将在代码中使用下面的指数分布对象,因此还有一个问题是如何将xor\u组合对象与分布,以便将“组合”传递到分布操作符()

Visual studio给了我一个在下面的代码中描述的错误

#include<iostream>
#include<random>
#include<ctime>
using namespace std;

int main()

{
    minstd_rand gen1;
    mt19937 gen2;
    linear_congruential_engine<unsigned long, 34999, 0, 3405989> seeder;

seeder.seed(static_cast<unsigned long>(time(false)));
xor_combine<minstd_rand, 4, mt19937, 9> combin;

exponential_distribution<float> expdist(2);

combin.seed(seeder);

// generate numbers
for(int i = 0; i < 10; ++i)     // error in <random> 
    cout << combin() << endl; // ERROR  C:2039 generate is not a member of std::congruential_engine<...> etc... 

cin.get();
    return 0;
}
#包括
#包括
#包括
使用名称空间std;
int main()
{
第1代部长;
mt19937第2代;
线性全等式发动机播种机;
播种机种子(静态施法(时间(假));
异或联合组合;
指数分布扩展(2);
精梳种子(播种机);
//生成数字
for(int i=0;i<10;++i)//中的错误

cout
std::xor_combine
在C++11中不存在。它已作为对的解析被删除

无争议。比尔是对的,但费米拉布认为这很容易使用,很难正确使用,因此应该完全删除。通过明确的路线进入TR1,我们有权删除东西吗?可能应该与Jens核实,因为人们相信他是发起者。广泛的共识是这不是坚固的发动机适配器

MSDN不是真正标准的参考。请参阅如何获取标准


您的“生成不是成员”问题是由于

combin.seed(seeder);
这将有效地调用

combin.base1().seed(seeder); // ignoring the const-ref
combin.base2().seed(seeder);
在TR1中,随机数生成器可以由另一个随机数生成器(n1836表16)播种。但是,在C++11中,随机数生成器应该由“种子序列”播种(n3290§26.5.1.2,不确定何时引入更改).C++11没有用于检查调用中的
seeder
是否为RNG或seed序列的概念,因此模板实例化将假定
seeder
为seed序列。“seed sequence”的要求之一是具有
.generate
成员函数(n3290表115),这就是您遇到编译器错误的原因

您可以尝试使用TR1引擎来解决这个问题,它不知道“种子序列”的概念,或者您可以将RNG封装到输入迭代器中,然后封装到
std::seed_seq
,或者只使用一个数字进行种子

unsigned long seed = ....;
combin.seed(seed);

最后两个问题:

  • 请注意,XOR是关联的。这意味着,您可以使用

    xor_combine<RNGa, sa, xor_combine<RNGb, sb, RNGc, sc>, 0>
    

  • xor\u combine
    在C++11标准中没有提到。它在std名称空间中,也包含在VS 11 beta中?你从哪里得到这些信息?我从C++11标准中得到了这些信息。非常感谢你的解释Kenny,你有一个如何将组合生成器传递到发行版的示例吗?这对于1个生成器ie.dist是可能的(gen)但是我该怎么做呢?好吧,对不起,我删除了我之前的评论:D在当前的c++11中有没有一种方法可以组合两个引擎?非常感谢。@codekiddy:你可以自己编写生成器。但是为什么要这样做呢?混合两个RNG通常不会产生更好的RNG。
    xor_combine<RNGa, sa, xor_combine<RNGb, sb, RNGc, sc>, 0>
    
    std::uniform_int_distribution<> d(0, 10);
    std::cout << d(combin) << std::endl;