gpt4 book ai didi

c++ - 如何生成海量高质量的随机数?

转载 作者:可可西里 更新时间:2023-11-01 16:19:11 24 4
gpt4 key购买 nike

我正在研究在晶格中移动的粒子的随机游走模拟。出于这个原因,我必须创建大量随机数,大约 10^12 及以上。目前我正在使用 C++11 提供的可能性 <random> .在分析我的程序时,我发现大部分时间花在了 <random> 上。 .这些数字中的绝大多数都在 0 到 1 之间,分布均匀。然后我需要一个二项分布的数字。但重点在于 0..1 数字。

问题是:我可以做些什么来减少生成这些数字所需的 CPU 时间,这会对它们的质量产生什么影响?

如您所见,我尝试了不同的引擎,但这对 CPU 时间没有太大影响。此外,我的 uniform01(gen) 之间有什么区别?和 generate_canonical<double,numeric_limits<double>::digits>(gen)无论如何?

编辑: 通读答案后我得出结论,我的问题没有理想的解决方案。因此,我决定首先让我的程序具备多线程能力,并在不同的线程中运行多个 RNG(使用一个 random_device 编号 + 一个线程个体增量作为种子)。暂时这个接缝是最不可避免的步骤(无论如何都需要多线程)。作为下一步,根据具体要求,我考虑切换到建议的英特尔 RNG 或 Thrust。这意味着我的 RNG 实现不应该太复杂,目前不是。但现在我喜欢关注我的模型的物理正确性而不是编程的东西,只要我的程序输出是物理正确的,就会出现这种情况。 Thrust Concerning Intel RNG

这是我目前所做的:

class Generator {
public:
Generator();
virtual ~Generator();
double rand01(); //random number [0,1)
int binomial(int n, double p); //binomial distribution with n samples with probability p
private:
std::random_device randev; //seed
/*Engines*/
std::mt19937_64 gen;
//std::mt19937 gen;
//std::default_random_engine gen;
/*Distributions*/
std::uniform_real_distribution<double> uniform01;
std::binomial_distribution<> binomialdist;
};

Generator::Generator() : randev(), gen(randev()), uniform01(0.,1.), binomial(1,1.) {
}

Generator::~Generator() { }

double Generator::rand01() {
//return uniform01(gen);
return generate_canonical<double,numeric_limits<double>::digits>(gen);
}

int Generator::binomialdist(int n, double p) {
binomial.param(binomial_distribution<>::param_type(n,p));
return binomial(gen);
}

最佳答案

您可以预处理随机数并在需要时使用它们。

如果您需要真正的随机数,我建议您使用类似 http://www.random.org/ 的服务这确保了由环境 ambient 而不是某些算法计算的随机数。

而且,谈到随机数,您还必须检查一下:

enter image description here

关于c++ - 如何生成海量高质量的随机数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26052653/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com