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

how to generate uncorrelated random sequences using c++

本文关键字:随机 不相关 何使用      更新时间:2023-10-16

我想生成两个不相关的正常分布式随机数x 1 ,x 2 。。

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

srand (time(NULL));

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

由于高质量随机数发电机生成的随机数是统一且独立的,因此您可以根据自己的意愿生成尽可能多的独立序列。

您不需要,不应种子两个不同的发电机。

在C (11)中,您应该使用标题<random>的伪随机数生成器。这是一个最小的示例,可以用作实际实现的模板:

std::random_device seed;
std::mt19937 gen{seed()};
std::normal_distribution<> dist1{mean1, sd1};
std::normal_distribution<> dist2{mean2, sd2};

现在,您可以通过调用dist1(gen)dist2(gen)生成独立的数字序列。random_device用于播种实际发电机,在我的代码中是Mersenne Twister Generator。这种类型的发电机是有效的,具有良好的统计特性。它应被视为(非密码安全)发电机的默认选择。

rand不支持生成多于单个序列。它将其状态存储在全球变量中。在某些系统(即符合POSIX的系统)上,您可以使用rand_r保持接近该方法。您只需将一些初始种子用作每个种子的内部状态。但是,由于您的问题是标记为C ,我建议您使用C 11中引入的随机数设备。或者,如果不是C 11的选项,请使用Boost中的随机模块。

不久前,我问了一个类似的问题,多个线程的随机数,答案也可能对您有用。他们讨论了如何确保序列不相互关联的各个方面,或者至少不是以明显的方式。

使用<random>中的normal_distribution使用两个random_device S(可能与某些使用引擎一起使用):

std::random_device rd1, rd2;
std::normal_distribution d;
double v1 = d(rd1);
double v2 = d(rd2);
...

另请参见http://en.cppreference.com/w/cpp/numeric/random/normal_distribution