【发布时间】:2015-08-14 04:22:41
【问题描述】:
我写了一个小代码来确保我可以从一个非常广泛的范围内获得随机数,例如。 [0, 10^36) 因为我稍后会使用这些宽范围。
我的代码如下:
#include <iostream>
#include <cmath>
#include <random>
#include <chrono>
int main()
{ unsigned seed = std::chrono::system_clock::now().time_since_epoch().count();
double expo = pow(10,36);
std::uniform_real_distribution<double> dist(0,expo);
std::mt19937_64 rng(seed);
for (int i=0; i<10; i++)
std::cout << dist(rng) << std::endl;
return 0;
}
以下是输出示例:
6.75507e+035
4.01129e+035
6.85525e+035
8.85896e+035
3.1455e+035
3.04962e+035
5.48817e+035
3.54502e+035
2.24337e+035
2.23367e+035
如您所见,随机数都非常接近给定区间的上端点。我尝试运行该程序很多次,也将 10 个数字增加到 100,但随机数总是接近区间的上端点(指数为 35,有时为 34)。
由于我使用了std::uniform_real_distribution,因此我希望也有一些数字,例如,有时会有 [0, 1000] 范围内的数字。我不认为这是一个均匀分布。这对我来说很重要,因为随机数不仅靠近上端点,因为我稍后将在 if 语句中使用随机数:
if (random_number == 0)
//do some operations
而上端点实际上将用作发生某事的速率。但似乎随机数有时不可能为零。
我不知道为什么会发生这种情况,非常感谢任何想法或帮助。
(Eclipse 4.4.1,Windows 7)
【问题讨论】:
-
如果
std::uniform_real_distribution<double> dist(0,1000)(rng)返回(精确)1000.0,那么您的实现中存在错误并且应该报告,因为间隔应该是半封闭的:[0, 1000)。返回 0 是可能的,但概率很小,可能小于千万亿分之一。