在c++中使用均匀实分布生成的随机数并不是真正均匀分布的
Random numbers generated using uniform real distribution in C++ are not really uniformly distributed
我写了一小段代码,以确保我可以从一个非常大的范围内获得随机数,例如[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)
可以看到,随机数都非常接近最大值给定区间的端点
不,他们不是。这个,例如:
2.23367e+035
请注意,在范围[0, 1e36]
中,子范围[1e35, 1e36]
是子范围[0, 1e35]
的9倍,因此在均匀分布中,您可以期望看到这些数字的频率是9倍。您偶尔会看到指数为34的数字,但指数低于34的数字非常罕见。
Benjamin Lindley的回答很好。我想补充一点,你可能在寻找一种不同的分布,而不是均匀分布。你可以这样写:
#include <iostream>
#include <cmath>
#include <random>
#include <chrono>
int main()
{
unsigned seed = std::chrono::system_clock::now().time_since_epoch().count();
std::uniform_real_distribution<double> dist(0, 36);
std::mt19937_64 rng(seed);
for (int i = 0; i < 20; i++)
{
std::cout << pow(10, dist(rng)) << std::endl;
}
return 0;
}
程序输出如下:
7.26972e+027
5.97e+010
3.50003e+034
3.42446e+021
2.93422e+035
111.724
2.73858e+019
55641.4
4.18253e+019
7.47441e+007
9.2706
7.45588e+009
3.26219e+007
5.6794e+027
4.67289e+026
4.24672e+014
3.97334e+010
14.7511
2.65037e+022
85279.3
如果你看一下这种情况的数学,一个数字更有可能具有指数10^35
,因为每个范围内可能的数字:
-
[1*10^35,1*10^36)
范围内有 -
[1*10^34,1*10^35)
范围内有 -
[1,1000]
范围内有
9*10^34
个不同的数字9*10^33
个不同的数字1000
个不同的数字所以你可以看到,指数10^35
是指数10^34
的10
倍,指数10^35
是指数[1,1000]
的9*10^32
倍。
相关文章:
- C++随机数分布传递给函数
- 在编译时选择随机数分布
- 从提升二项分布中抽取随机数
- 在 c++ 中创建具有指数分布的随机数(可视化标准)
- 用具有不同范围的均匀分布的随机数填充多维矩阵
- 是否有在 c++ 中使用三角分布生成随机数的函数
- 生成C++中的正态分布随机数
- 如何在没有浮点数/双精度数的情况下生成均匀和高斯分布的伪随机数
- 使用推力生成均匀分布的随机数
- 生成属于指数分布的随机数
- C++生成范围内服从正态分布的随机数
- 如何生成指数分布的随机数(带均值)
- 如何在 GCC 5 中为指数分布生成随机数
- 随机数生成器 - 直方图构造(泊松分布和计数变量)
- 随机数的正态分布会挂起程序
- C++11 随机数分布在各个平台上并不一致——有什么替代方案
- C++指数分布模板类生成不精确的随机数
- 指定的随机分布使用哪种类型的随机数引擎
- 如何在vs2010中生成均匀分布随机数
- 均匀分布随机数生成