我正在尝试学习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
答案 0 :(得分:2)
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);
最后两个问题:
请注意,XOR是关联的。这意味着,你可以使用
xor_combine<RNGa, sa, xor_combine<RNGb, sb, RNGc, sc>, 0>
组合3个引擎
您将xor_combine
对象传递给与所有其他RNG一样的分发,例如
std::uniform_int_distribution<> d(0, 10);
std::cout << d(combin) << std::endl;