相关疑难解决方法(0)

Mersenne twister热身与再现性

在我目前的C++ 11项目中,我需要执行M模拟.对于每个模拟m = 1, ..., M,我使用一个std::mt19937对象随机生成一个数据集,构造如下:

std::mt19937 generator(m);
DatasetFactory dsf(generator);
Run Code Online (Sandbox Code Playgroud)

根据/sf/answers/1085695971//sf/answers/1044704531/,Mersenne Twister PRNG受益于热身阶段,目前我的代码中没有.为方便起见,我提出了建议的代码片段:

#include <random>

std::mt19937 get_prng() {
    std::uint_least32_t seed_data[std::mt19937::state_size];
    std::random_device r;
    std::generate_n(seed_data, std::mt19937::state_size, std::ref(r));
    std::seed_seq q(std::begin(seed_data), std::end(seed_data));
    return std::mt19937{q};
}
Run Code Online (Sandbox Code Playgroud)

在我的情况下的问题是我需要结果的可重复性,即在不同的执行中,对于每个模拟,数据集必须是相同的.这就是为什么在我目前的解决方案中,我使用当前的模拟种子Mersenne Twister PRNG.在我看来,使用std::random_device防止数据是相同的(AFAIK,这是确切的目的std::random_device).

编辑:通过不同的执行我的意思是重新启动可执行文件.

如何在不影响再现性的情况下在代码中引入上述预热阶段?谢谢.

可能的解决方案#1

这是基于@SteveJessop的第二个提案的暂定实现

#include <random>

std::mt19937 get_generator(unsigned int seed) {
        std::minstd_rand0 lc_generator(seed);
        std::uint_least32_t seed_data[std::mt19937::state_size];

        std::generate_n(seed_data, std::mt19937::state_size, std::ref(lc_generator));
        std::seed_seq q(std::begin(seed_data), std::end(seed_data));
        return std::mt19937{q};
    }
Run Code Online (Sandbox Code Playgroud)

可能的解决方案#2

这是基于@SteveJassop和@AndréNeve联合贡献的暂定实施.该sha256功能改编自/sf/answers/744290781/

#include <openssl/sha.h>
#include …
Run Code Online (Sandbox Code Playgroud)

c++ random prng mersenne-twister c++11

15
推荐指数
1
解决办法
2591
查看次数

在java cross-plateform-ably中没有时间播种随机发生器

我几乎同时在两个线程上初始化两个随机数生成器,我希望两个生成器的行为完全不同.我会Random.nextInt(7)经常一个接一个地打电话给两台发电机.使用System.currentTimeMillis()不是一个好主意,因为看起来我的电脑速度太快,以至于从两台发电机获得的数字很可能是相同的.那么有没有办法配置,Random所以虽然它们被一个接一个地调用,但它们仍然表现不同?我希望该解决方案能够跨平台兼容,因此任何特定于平台的想法(例如读取)/dev/random都是不可接受的.感谢帮助.

java random

6
推荐指数
1
解决办法
1600
查看次数

如何使用c ++生成不相关的随机序列

我想生成两个不相关的正态分布随机数X 1,X 2的序列.

由于正态分布随机数来自统一数,我只需要两个不相关的统一序列.但是如何使用:

srand (time(NULL));
Run Code Online (Sandbox Code Playgroud)

我想我需要种子两次或做类似的事情?

c++ random math

2
推荐指数
1
解决办法
874
查看次数

标签 统计

random ×3

c++ ×2

c++11 ×1

java ×1

math ×1

mersenne-twister ×1

prng ×1