rand () и реализация Mersenne Twister C ++

0

Мне нужно реализовать хороший RNG, и я думаю, что Mersenne Twister может быть для меня хорошим. Я нигде не нашел работы C++, я плохой поисковик Google или это действительно не так просто найти?! Я пробовал перед rand():

srand((unsigned)time(0));
for (int i = 0; i < 9; i++) {
     random =  rand();
     cout<<random;
}

Я не знаю, почему, но случайная величина всегда совпадает с номером..... НО, если я добавлю Sleep(1000), он работает! Как это:

srand((unsigned)time(0));
for (int i = 0; i < 9; i++) {
    random =  rand();
    cout<<random;
    Sleep(1000);
}

Поэтому я решил попробовать Mersenne Twister... Может ли кто-нибудь найти решение этого (потому что мне нужно найти очень большое количество случайных чисел, поэтому я не могу использовать Sleep(1000), это займет время!) Или помощь меня реализовать Mersenne Twister или, возможно, еще один хороший RNG. Спасибо и извините за мой плохой английский...

Теги:
random

2 ответа

7

С++ 11 включает в себя mersenne twister со random стандартным заголовком библиотеки.

1

Boost.Random - это доступная реализация, если ваша реализация STL ее не имеет.

Вы можете использовать random_device для получения случайного семени, а затем передать его конструктору mt19937 для инициализации генератора случайных чисел.
Затем вы можете использовать uniform_int_distribution чтобы получить случайное целое число, равномерно распределенное в закрытом диапазоне [a, b] которое вы укажете в конструкторе uniform_int_distribution.

Вы можете рассмотреть этот примерный код (скомпилированный с помощью g++ 4.8.1):

#include <iostream>
#include <boost\nondet_random.hpp>
#include <boost\random.hpp>

int main() {        
    // Get a random seed
    boost::random_device rd;
    const auto seed = rd();

    // Marsenne Twister generator
    boost::random::mt19937 mt(seed);

    // Get random integers uniformly distributed in range [0, 99]
    boost::random::uniform_int_distribution<int> dist(0, 99);

    // Print 10 random numbers, uniformly distributed in previous range
    for (int i = 0; i < 10; ++i) {
        std::cout << dist(mt) << " ";
    }
    std::cout << std::endl;    
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню