结合RNG?带分发的std :: xor_combine模板?

时间:2012-04-29 06:26:44

标签: c++ random c++11

我正在尝试学习C ++ 11 随机内容,因此我已经在stackoverflow上复制了this网站上的示例...

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

此外,您还会在代码中显示一个指数分布对象,所以还有一个问题是如何将 xor_combine lobject与分布相结合,以便我传递"组合&# 34;分配 operator()

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;
}

1。如何将第3个引擎传递给xor_combine对象?

2。如何将xor_combine对象传递给分发对象? * 修改 *

#include<iostream>
#include<random>
#include<ctime>
int main()
{
    std::minstd_rand gen1;
    std::mt19937 gen2;
    std::xor_combine<std::minstd_rand, 3, std::mt19937, 6> combin(gen1, gen2);
    std::uniform_int_distribution<unsigned int> dist(0,37);
    combin.seed(static_cast<unsigned int>(time(0)));
    std::cout << dist( combin ) << std::endl;
    std::cin.get();
    return 0;
}

错误1错误C2352:&#39; std :: xor_combine&lt; _Engine1,_S1,_Engine2,_S2&gt; :: max&#39; :非静态成员函数非法调用c:\ program files(x86)\ microsoft visual studio 11.0 \ vc \ include \ xutility 3455 Project1 1

1 个答案:

答案 0 :(得分:2)

C ++ 11中不存在

std::xor_combine。它已作为Library Defect Report 789的解决方案删除。

  

非争议。 Bill是对的,但Fermilab认为这很容易使用,并且很难正确使用,因此应该完全删除。通过明确定义的路径进入TR1,我们是否有权删除内容?应该和Jens一起检查,因为据信他是创始人。广泛认为这不是一个强大的引擎适配器。

MSDN不是对真实标准的引用。请参阅Where do I find the current C or C++ standard documents?了解如何获得标准。


您的“生成不是会员”问题是因为

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或种子序列,因此模板实例化将假定seeder是种子序列。 “种子序列”的要求之一是具有.generate成员函数(n3290表115),这就是您遇到编译器错误的原因。

您可以尝试通过使用TR1引擎来解决这个问题,TR1引擎不了解“种子序列”概念,或者您可以将RNG包装到输入迭代器中,然后包装到std::seed_seq中,或者只是种子有一个数字。

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

最后两个问题:

  1. 请注意,XOR是关联的。这意味着,你可以使用

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

    组合3个引擎

  2. 您将xor_combine对象传递给与所有其他RNG一样的分发,例如

    std::uniform_int_distribution<> d(0, 10);
    std::cout << d(combin) << std::endl;