Известные различия в повышении случайного выхода от 1,58 до 1,67? - PullRequest
0 голосов
/ 30 мая 2019

Я работаю с устаревшим кодом, который не написал, который генерирует случайные данные.Выходные данные изменились после обновления до 1.67 с 1.58.Обычно воспроизводимый вывод происходит с помощью фиксированного начального ключа.Но теперь они отличаются между новыми и старыми версиями.

Используются случайные распределения ускорения, такие какiform_int ,iform_real, exponential_distribution и normal_distribution.Кто-нибудь знает, что одна из них или более отличается от буст-версий, которые я упомянул?

Возможно, мне придется написать простую тестовую прогу, чтобы убедиться в этом.

Ответы [ 2 ]

2 голосов
/ 31 мая 2019

По крайней мере нормальное и экспоненциальное распределения, где было изменено использование (улучшенная версия) метода Зиккурата в июле 2016 года, c.f. https://github.com/boostorg/random/commit/c7d1b4f3516098b3e2fc8f8531d716881ab5834e. Это конкретное изменение впервые появилось в версии 1.62 (выпущена в октябре 2016 года). Я не проверял больше назад во времени.

1 голос
/ 03 июня 2019

Я обнаружил, что нормальное распределение определенно отличается от тестовой программы, смоделированной от этого другого ответа: Повышение генератора случайных чисел .Также похоже на типичное использование моей утилиты, я думаю, что она просто использует обычную, но экспоненциальная будет вызвана другой опцией.Во всяком случае, я подтвердил различия для нескольких тысяч итераций в двух версиях, которые я впервые упомянул.Затем, увидев ответ от Ральфа Стубнера (спасибо), я провел еще одно исчерпывающее тестирование и вижу подтвержденную разницу в 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;
    }
}
...