【问题标题】:Generating random doubles in different ranges在不同范围内生成随机双打
【发布时间】:2013-05-24 00:39:11
【问题描述】:

在我的程序中,我需要重复(数百万次)生成随机双精度数,并且有几个变量分布平坦,但范围不同。目前这就是我所做的:

double w, v, k;
double wmax = 0.5;
double vmax = 1.0;

std::random_device rd;
std::default_random_engine dre(rd());
std::uniform_real_distribution<double> wRand(-wmax, wmax);
std::uniform_real_distribution<double> vRand(-vmax, vmax);
std::uniform_real_distribution<double> kRand(0.0, 1.0);

w = wRand(dre);
v = vRand(dre);
k = kRand(dre);

这是一种正确的方法,还是有一个分布并从中构造所有数字会更好?我对性能问题非常谨慎,我觉得有一个分布和几个算术运算会更快。会吗?这种情况下随机数的比较质量如何?

【问题讨论】:

  • 在出现问题之前不要担心性能问题。在此之前只关注程序的正确性。
  • @Patashu 我不想写半页史前史等。程序运行良好,我已经优化了其中的所有基本内容。这个随机生成是非常有影响力的时间消耗者,我不想把它搞砸。
  • 您是在每次循环调用时生成每个 w、v、k 变量,还是会改变每个变量的生成频率?
  • 一个循环中的前两个数字,但生成的次数不同(第二个更少,取决于第一个中的值)。第三个数字在另一个独立的循环中。
  • 双精度非常高,需要很多随机性。也许您可以使用更差但更快的 RNG。

标签: c++ performance random c++11


【解决方案1】:

我的建议是使用具有三个算术运算的单个分布来适当地缩放它们。它将使用更少的内存并且算术运算会很快。

但您的整体性能将更多地取决于您如何构建循环并最大限度地减少分支错误预测。 See this question

【讨论】:

  • 哇,谢谢你的链接,我最近读了很多关于这个话题的书,但还没有看到这个问题。看起来很有用!但我认为我已经优化了该领域的一切,这个问题可能更多的是关于良好的编程实践。我想说当前的表单对我来说有点难看,但是插入算术表达式而不是简单的随机生成器看起来很笨重......
  • 好吧,我会把算术表达式放在内联函数或宏中。
猜你喜欢
  • 1970-01-01
  • 2013-09-01
  • 1970-01-01
  • 2010-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多