gpt4 book ai didi

C++ 快速正态随机数生成器

转载 作者:太空狗 更新时间:2023-10-29 20:37:46 26 4
gpt4 key购买 nike

我正在使用 mt19937 生成器生成正常的随机数,如下所示:

normal_distribution<double> normalDistr(0, 1);    
mt19937 generator(123);
vector<double> randNums(1000000);
for (size_t i = 0; i != 1000000; ++i)
{
randNums[i] = normalDistr(generator);
}

上面的代码有效,但是由于我在我的代码中生成了超过 1 亿个正常随机数,所以上面的代码非常慢。

有没有更快的方法生成正态随机数?

以下是有关如何使用代码的一些背景信息:

  • 随机数的质量并不那么重要
  • 数字的精度不是那么重要,doublefloat 都可以
  • 正态分布始终具有均值 = 0 和西格玛 = 1

编辑:

@Dúthomhas,安德鲁:

分析后,以下函数占用了超过 50% 的时间:

std::normal_distribution<double>::_Eval<std::mersenne_twister_engine<unsigned int,32,624,397,31,2567483615,11,4294967295,7,2636928640,15,4022730752,18,1812433‌​253> >

最佳答案

最重要的是,您真的同时需要 100,000,000 个随机数吗?将所有这些数据写入 RAM 以及随后从 RAM 中读取这些数据不可避免地需要大量时间。如果您一次只需要一个随机数,则应避免这种情况。

假设您确实需要 RAM 中的所有这些数字,那么您应该首先如果您真的想知道 CPU 时间在哪里花费/丢失,请分析您的代码。

其次,您应该避免不必要的数据重新分配和初始化。这可以通过结合使用 std::vector::reserve(final_size)std::vector::push_back() 轻松完成。

第三,您可以使用比 std::mt19937 更快的 RNG。当数字的质量很重要时,建议使用 RNG。 online documentationlagged Fibonacci generator (在 std:: subtract_with_carry_engine 中实现)速度很快,但重复周期可能不够长——您必须检查一下。或者,您可能想使用 std::min_stdrand(它使用 linear congruential generator)

std::vector<double> make_normal_random(std::size_t number,
std::uint_fast32_t seed)
{
std::normal_distribution<double> normalDistr(0,1);
std::min_stdrand generator(seed);
std::vector<double> randNums;
randNums.reserve(number);
while(number--)
randNums.push_back(normalDistr(generator));
return randNums;
}

关于C++ 快速正态随机数生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33804736/

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