我寫了一個小的代碼,以確保我可以從一個非常廣泛的範圍得到的隨機數,恩。 [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 dist(0,1000)(rng)'返回(確切地)1000.0,那麼在您的實現中存在一個錯誤並且應該報告它,因爲間隔應該是半關閉的:'[0,1000)'。返回0是可能的,但概率是微觀的,可能小於一個四捨五入。 –
rici