Я обнаружил, что нормальное распределение определенно отличается от тестовой программы, смоделированной от этого другого ответа: Повышение генератора случайных чисел .Также похоже на типичное использование моей утилиты, я думаю, что она просто использует обычную, но экспоненциальная будет вызвана другой опцией.Во всяком случае, я подтвердил различия для нескольких тысяч итераций в двух версиях, которые я впервые упомянул.Затем, увидев ответ от Ральфа Стубнера (спасибо), я провел еще одно исчерпывающее тестирование и вижу подтвержденную разницу в 1,64 против 1,57.После этого выход снова будет соответствовать как минимум до 1,67.Я пытался от 1.57 до 1.67.
Скомпилировал тестовую программу следующим образом: g ++ -I / opt / boost_1_57_0 random_example.cc -O3 -o random_example Вызван как: random_example 0 0 9999999> /tmp/random_example_boost_1_57_0_0_t_999*
# number of differences in ten million lines
root@ubuntu-02:/tmp# baseline=random_example_boost_1_57_0_0_0_9999999.txt
root@ubuntu-02:/tmp# test=random_example_boost_1_64_0_0_0_9999999.txt
root@ubuntu-02:/tmp# diff -U 0 $baseline $test | grep ^@ | wc -l
5796
# look at first 5 lines of difference
root@ubuntu-02:/tmp# diff $baseline $test | head -5
261,262c261
< -36.8701
< -3.78609
---
> -38.8405
root@ubuntu-02:/tmp#
Пример кода:
random_example.cc:
#include <iostream>
#include "boost/random.hpp"
#include "boost/generator_iterator.hpp"
using namespace std;
int main(int argc, char **argv) {
typedef boost::rand48 RNGType;
int seed = 0;
int start = 1;
int stop = 100;
if (argc>=2) {
seed = atoi(argv[1]);
}
if (argc>=3) {
start = atoi(argv[2]);
}
if (argc>=4) {
stop = atoi(argv[3]);
}
RNGType rng(seed);
typedef boost::normal_distribution<> dist_t;
boost::normal_distribution<> distribution_params(0.0, 10.0);
boost::variate_generator< RNGType, dist_t >
dice(rng, distribution_params);
for ( int i = start; i <= stop; i++ ) {
double n = dice();
cout << n << endl;
}
}