Генерация случайных чисел с помощью Well44497a в C++

Извините, что беспокою снова, но, поскольку я новый C++, у меня много странных и глупых проблем.

Я программирую метод MCMC. Я читал на этом форуме, что WELL RNG был хорошей альтернативой для генерации случайных чисел, поэтому я пытаюсь заставить его работать. Итак, вот вопросы:

  1. Я компилирую "Well44497a.c" в моем проекте C++ без дальнейших изменений. Это скомпилировано. Это правильно или я должен внести какие-то изменения?

  2. Я использую следующую схему внутри моего кода, но он просто генерирует цикл из 3 RN

Решено: проблема заключалась в том, что InitWELLRNG44497a(состояние) должен располагаться вне функции. Я перезапускал генератор каждый раз, когда генерировал образец. Для всего цикла генератор должен быть инициализирован только один раз.

    int* sampler(PARAMETERS) { //this function returns a sample

    int k;

    unsigned int state[1391];

    for (k = 0; k < 1391; ++k) 
    {
        state[k] = k;
    }

    InitWELLRNG44497a(state); //THIS SHOULD GO ON THE CALLER FUNCTION NOT HERE

    double value_first = valuate(first_state); // this function valuates one of two possible states
    double value_second = valuate(second_state); 

    double rand_number = WELLRNG44497a()

    if(rand_number > value_first / (value_first + value_second))
       return second_state;
    else
       return first_state;
    }        

1 ответ

Решение

Ваша функция появляется для инициализации state массив с одинаковыми значениями каждый раз, когда вы вызываете sampler() функция. Идея state массив состоит в том, что он содержит текущее состояние генератора случайных чисел, и что вы не возитесь с содержимым state между звонками в ГСЧ.

Сделать state массив global в вашей программе, инициализируйте его один раз, и не трогайте его после инициализации.

Другие вопросы по тегам