Одномерный шум с использованием твистера Мерсенна дает разные результаты на разных устройствах

Я генерирую 2D-территорию с 1D-шумом перлина, используя Mersenne Twister для случайных чисел. Моя первая мысль заключалась в том, что использование Mersenne Twister всегда будет давать мне одинаковые результаты с одним и тем же начальным числом на любом данном оборудовании. Но когда я сравниваю значения/территорию на разных устройствах, это дает разные результаты. (Это работало для IOS, OSX и MAC, но не для WP8).

Код:

class 1DNoiseTest
{
    typedef std::mt19937 MyRNG;
    MyRNG rng;
1DNoiseTest( unsigned seed )
    {
        rng.seed(seed);
        std::uniform_real_distribution<double> distribution(0.0,1.0);
        for ( unsigned i = 0; i < kMaxVertices; ++i )
        {
            r[ i ] = ( distribution(rng)); error
        }
    }

...

Я неправильно понимаю Mersenne Twister или делаю что-то не так? Как я могу получить одинаковую местность/значения на каждом устройстве/оборудовании?

Спасибо за ваше время!


person user3433660    schedule 11.05.2015    source источник
comment
У ваших устройств разные размеры слов? Я думаю, что MT19937 генерирует разные значения в 32-битных и 64-битных системах.   -  person Lynn    schedule 11.05.2015
comment
В настоящее время я использую nokia lumia 920. Я думаю, что это 32-битный процессор Snapdragon S4 MSM8960. Другим устройством является iPad mini без сетчатки и 32-разрядное приложение macbook pro.   -  person user3433660    schedule 11.05.2015
comment
этот пост предлагает другой генератор случайных чисел: stackoverflow.com/a/9269526/3433660 . Безопасна ли эта кросс-платформа?   -  person user3433660    schedule 12.05.2015
comment
@ user3433660 Этот пост полностью устарел и устарел. Не используйте его.   -  person Konrad Rudolph    schedule 12.05.2015
comment
@KonradRudolph, не могли бы вы объяснить, почему? Это дает мне довольно хорошие результаты для моей местности с действительно независимыми от платформы значениями и работает на всех ОС.   -  person user3433660    schedule 13.05.2015
comment
@ user3433660 (1) Это плохой генератор случайных чисел. Если вам кажется, что это дает хорошие результаты — вполне справедливо. Но имейте в виду, что они, вероятно, не так случайны, как вы думаете, и это может привести к странным артефактам (либо внезапным повторяющимся пейзажам, либо чему-то еще); а может и нет: понятия не имею, но безопаснее просто использовать хорошие случайные числа, а не плохие. Это предполагает меньше удачи. (2) API. API случайных чисел C++11 (хотя и далеко не идеальный) был разработан, чтобы его можно было легко компоновать со стандартными алгоритмами. Класс CRnd, на который вы ссылаетесь, напротив, имеет нестандартный (и просто ужасный) API.   -  person Konrad Rudolph    schedule 13.05.2015
comment
@KonradRudolph хорошо, спасибо!   -  person user3433660    schedule 14.05.2015


Ответы (1)


Смотрите этот вопрос:

Воспроизводимость случайного распределения кросс-компилятора C++11/стандартной библиотеки

std::uniform_real_distribution не гарантирует одинаковых результатов для разных компиляторов.

person mareko    schedule 17.05.2017