相关疑难解决方法(0)

跨平台的一致的伪随机数

我正在寻找一种方法来生成伪随机数序列,这将为任何平台上的给定种子产生相同的序列结果.我假设rand()/ srand()不会保持一致(我对这个假设很容易出错).

c c++ random

28
推荐指数
3
解决办法
8274
查看次数

C++ 11标准是否保证跨实现的相同种子的相同随机数?

例如,如果我std::mt19937在GCC和MSVC下使用完全相同的种子和参数实例化a ,我应该得到相同的随机数序列吗?如果是这样的话,我认为这个属性通常适用于mersenne_twister_engine,因为mt19937只是一个具有特定参数的属性.这rand()在C中是不正确的.看起来标准文档是根据特定代码应用的转换,所以我怀疑它应该始终是相同的,但是魔鬼在细节中......

c++ random standards c++11

20
推荐指数
1
解决办法
1013
查看次数

我应该在我的C++标准随机分布上调用reset()来清除隐藏状态吗?

我想用C++ 11标准库中的随机数分布包含简单的函数,这些函数将分布的参数和生成器实例作为参数.例如:

double normal(double mean, double sd, std::mt19937_64& generator)
{
    static std::normal_distribution<double> dist;
    return dist(generator, std::normal_distribution<double>::param_type(mean, sd));
}
Run Code Online (Sandbox Code Playgroud)

我想避免分发对象中的任何隐藏状态,以便每个对此包装函数的调用仅取决于给定的参数.(可能每次调用此函数都可以使用不同的生成器实例.)理想情况下,我会使分发实例static const确保这一点; 但是,分布operator()不是const函数,所以这是不可能的.

我的问题是:为确保分发中没有隐藏状态,是否1)必要且2)足以reset()每次呼叫分配?例如:

double normal(double mean, double sd, std::mt19937_64& generator)
{
    static std::normal_distribution<double> dist;
    dist.reset();
    return dist(generator, std::normal_distribution<double>::param_type(mean, sd));
}
Run Code Online (Sandbox Code Playgroud)

(总的来说,我reset()对随机分布函数的目的感到困惑......我理解为什么生成器有时需要重置/重新设置,但为什么分配对象需要重置?)

c++ random standard-library c++11

10
推荐指数
1
解决办法
2113
查看次数

stl随机分布和可移植性

为什么标准发行版的结果不是强制要求在各实现之间保持一致?伪随机数生成器的结果对经授权的是相同的另一方面.

例如,以下几乎肯定会为每个不同的标准库实现打印不同的东西.

std::mt19937 random {100};
std::normal_distribution<> dist;

std::cout << dist(random);
Run Code Online (Sandbox Code Playgroud)

假设我想进行程序生成,并希望相同的起始种子在平台和编译器之间产生相同的结果.我无法用stl做到这一点.我必须"回归"使用提升.为什么这不是缺陷?

c++ random stl cross-platform c++11

8
推荐指数
1
解决办法
691
查看次数

标签 统计

c++ ×4

random ×4

c++11 ×3

c ×1

cross-platform ×1

standard-library ×1

standards ×1

stl ×1