Перейти к содержанию
    

Генератор случайных чисел на STM32

2 minutes ago, esaulenka said:

Вы почитайте, что-ли, что это за алгоритм такой. Никто не обещал, что генератор случайных чисел не выдаст подряд десяток одинаковых значений. Да, вероятность ОЧЕНЬ маленькая, но ненулевая. Вероятность "два одинаковых значения в произвольных местах" - очевидно выше, и тоже далеко ненулевая.

 

Я не математик ни разу, но это легко доказывается на практике.

  Reveal hidden contents
#include <random>
#include <iostream>
#include <vector>
#include <algorithm>
#include <chrono>


int main()
{
    auto start_time = std::chrono::system_clock::now();

    //using rand_gen_t = std::mt19937_64;
    using rand_gen_t = std::mt19937;

    std::random_device rd;
    rand_gen_t rndgen{ rd() };

    std::vector<rand_gen_t::result_type> rndlist;
    for (size_t i = 0; i < 1000'000'000; ++i)
        rndlist.push_back(rndgen());

    std::sort(rndlist.begin(), rndlist.end());

    size_t count = 0;
    for (size_t i = 0; i < rndlist.size() - 1; ++i)
        if (rndlist[i] == rndlist[i + 1])
        {
            //std::cout << "found the same value " << rndlist[i] << " at " << i << "\n";
            ++count;
        }
    std::cout << "found " << count << " pairs\n";

    std::cout << "Time spent " << 
        std::chrono::duration_cast<std::chrono::seconds>(std::chrono::system_clock::now() - start_time).count() << " seconds \n";

}

 

Для Мерсенна с 32-битным выходом среди миллиарда (!) значений совпадений... немало:

found 107892738 pairs
Time spent 160 seconds

Для 64-битного варианта совпадений у меня не было, но это не значит, что их не будет в принципе.

 

 

 

А какой период у Вас выбран?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

11 minutes ago, mplata said:

А какой период у Вас выбран?

Ну так код же есть, там всё стандартно-библиотечное.

Я не настолько самоуверен, чтобы свои крипто-алгоритмы изобретать 🙂

 

https://en.cppreference.com/w/cpp/numeric/random/mersenne_twister_engine

https://ru.wikipedia.org/wiki/Вихрь_Мерсенна#Параметры_32-битного_генератора_MT

 

И да, период обозначает количество итераций, когда алгоритм начнёт в точности повторять выданную последовательность. И он ДОСТАТОЧНО большой, чтобы никогда не увидеть подобного в реальной жизни, это авторы алгоритма гарантируют.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...