gpt4 book ai didi

c++ - 结合组合RNG?带分布的 std::xor_combine 模板?

转载 作者:行者123 更新时间:2023-11-28 03:37:43 26 4
gpt4 key购买 nike

我正在尝试学习 C++11 随机 的东西,所以我从 this 复制了一个示例在 stackoverflow 上找到的网站...

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

此外,您还会在代码中看到一个指数分布对象,所以还有一个问题是如何将 xor_combine 对象与分布结合起来,以便将“组合”传递给分布运算符() ?

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:'std::xor_combine<_Engine1,_S1,_Engine2,_S2>::max':非法调用非静态成员函数 c:\program files (x86)\microsoft visual studio 11.0\vc\include\xutility 3455 Project1 1

最佳答案

std::xor_combine 在 C++11 中不存在。它已作为对 Library Defect Report 789 的决议被删除.

Non-controversial. Bill is right, but Fermilab believes that this is easy to use badly and hard to use right, and so it should be removed entirely. Got into TR1 by well defined route, do we have permission to remove stuff? Should probably check with Jens, as it is believed he is the originator. Broad consensus that this is not a robust engine adapter.

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


你的“generate is not a member”问题是因为

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 引擎来解决此问题,或者您可以将 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;

关于c++ - 结合组合RNG?带分布的 std::xor_combine 模板?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10370195/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com