gpt4 book ai didi

c++ - 几个随机数c++

转载 作者:搜寻专家 更新时间:2023-10-30 23:56:44 25 4
gpt4 key购买 nike

我是一名物理学家,正在编写一个程序,该程序涉及从高斯分布中生成多个(数十亿数量级)随机数。我正在尝试使用 C++11。这些随机数的生成由一个应该花费很少时间的操作分开。我最大的担心是,如果我生成如此多的随机数,时间间隔这么小,是否可能导致性能不佳。我正在测试某些统计属性,这些属性在很大程度上依赖于数字随机性的独立性,因此,我的结果对这些问题特别敏感。我的问题是,对于我在下面的代码(我的实际代码的简化版本)中提到的数字类型,我是否做错了什么明显(甚至是微妙)的错误?

#include <random>

// Several other includes, etc.

int main () {

int dim_vec(400), nStats(1e8);
vector<double> vec1(dim_vec), vec2(dim_vec);

// Initialize the above vectors, which are order 1 numbers.

random_device rd;
mt19937 generator(rd());
double y(0.0);
double l(0.0);

for (int i(0);i<nStats;i++)
{
for (int j(0);j<dim_vec;j++)
{
normal_distribution<double> distribution(0.0,1/sqrt(vec1[j]));
l=distribution(generator);
y+=l*vec2[j];
}
cout << y << endl;
y=0.0;
}
}

最佳答案

normal_distribution 允许有状态。对于这种特定的分布,每隔一次调用都会成对生成数字,并且在奇数调用中返回第二个缓存的数字。通过在每次调用时构建一个新的分布,您将丢弃该缓存。

幸运的是,您可以通过调用不同的 normal_distribution::param_type's 来“塑造”单个分布:

 normal_distribution<double> distribution;
using P = normal_distribution<double>::param_type;
for (int i(0);i<nStats;i++)
{
for (int j(0);j<dim_vec;j++)
{
l=distribution(generator, P(0.0,1/sqrt(vec1[j])));
y+=l*vec2[j];
}
cout << y << endl;
y=0.0;
}

我不熟悉 std::normal_distribution 的所有实现。但是我为 libc++ 写了一个.因此,我可以肯定地告诉您,我对您的代码稍作重写会对性能产生积极影响。我不确定它会对质量产生什么影响,只是说我知道它不会降低质量。

更新

关于 Severin Pappadeux下面关于在一个分布中一次生成一对数字的合法性的评论:参见 N1452讨论并允许使用这种技术的地方:

Distributions sometimes store values from their associated source of random numbers across calls to their operator(). For example, a common method for generating normally distributed random numbers is to retrieve two uniformly distributed random numbers and compute two normally distributed random numbers out of them. In order to reset the distribution's random number cache to a defined state, each distribution has a reset member function. It should be called on a distribution whenever its associated engine is exchanged or restored.

关于c++ - 几个随机数c++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27234395/

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