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

时间:2014-01-24 07:53:30

标签: c++ math random

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

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

srand (time(NULL));

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

3 个答案:

答案 0 :(得分:6)

由于高质量随机数生成器生成的随机数是统一且独立的,因此您可以根据需要从中生成任意数量的独立序列。

您不需要,不应为两个不同的生成器播种。

在C ++(11)中,您应该使用pseudo-random number generator from the header <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生成器。这种类型的发电机效率高,具有良好的统计特性。它应被视为(非加密安全)生成器的默认选择。

答案 1 :(得分:0)

rand不支持生成多个序列。它将其状态存储在全局变量中。在某些系统(即符合POSIX的系统)上,您可以使用rand_r来接近该方法。你只需使用一些初始种子作为每个种子的内部状态。但由于你的问题被标记为C ++,我建议你使用C ++ 11中引入的random number facilities。或者,如果无法选择C ++ 11,请使用random module中的boost

前段时间我曾问过类似的问题,Random numbers for multiple threads,答案也可能对你有用。他们讨论了如何确保序列不相互关联,或者至少不是以明显的方式相关的各个方面。

答案 2 :(得分:-1)

使用来自random_device的{​​{1}}的两个normal_distribution(可能使用一些引擎):

<random>

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

的示例代码