我想生成两个不相关的正态分布随机数X 1 ,X 2 的序列。
由于正态分布随机数来自统一数,我需要的是两个不相关的均匀序列。但是如何使用:
srand (time(NULL));
我想我需要播种两次或做类似的事情吗?
答案 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
的示例代码