Помогите испортить "Вихрь Мерсена"

Тема в разделе "WASM.BEGINNERS", создана пользователем intel_x128, 28 сен 2009.

  1. intel_x128

    intel_x128 New Member

    Публикаций:
    0
    Регистрация:
    17 май 2009
    Сообщения:
    345
    Есть генератор случайных чисел (Вихрь Мерсена)

    Все хорошо, но при большом количестве итераций распределение случайных величин слишком идеально.


    Т.е.

    Есть процедура gen_rnd32() - собственно сам вихрь менсена
    Есть надстройка _random(), которая возвращает числа от 0 до 9.

    Проблема в том, что при миллиарде итераций количество чисел примерно одинаково, т.е. количество нулей примерно равно количеству единиц и т.д.
    В общем распределение уж слишком хорошее.

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

    Все мои попытки успехом не увенчались, т.к. я смог лишь сместить распределение (т.е. каких-то чисел стало на столько-то процентов больше, а каких-то меньше. При чем чисто статистически, можно заранее предугадать, что и чего будет больше или меньше.
    Сделать распределение случайным - увы, я не смог, т.к. прихрамывает матчасть)

    Помогите сделать надстройку над _random() которая почти наверняка испортит распределение и сделает его более неравномерным.

    Заранее благодарен
     
  2. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Все генераторы псевдослучайных чисел выдают заданное распределение, даже если оно неравномерное (почитать про это можно здесь) А тебе похоже нужно истинно а не псевдо случайное число - его обычно получают с помощью таймеров или счёчика тактов. Имхо rdtsc будет то что тебе нужно - младшая часть этого счётчика меняется достаточно быстро и труднопредсказуемо чтобы выполнять роль случайного числа. Но вообще-то равномерное распределение это "самое случайное из случайных" :)).
     
  3. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Ещё истинно случайные числа можно получать от мыши или клавы (но это геморой, требующий присутствия и активности юзера), поэтому лучше взять шумовой сигнал, например с микрофона. Или можешь собрать в прогу кучу псевдослучайных генераторов с разными распределениями и через N чисел переключаться на другой выбирая генератор по rdtsc.
     
  4. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    Ничего не прихрамывает. Ты пытаешься придумать меру случайности на основе статистических формул, которые и выдуманы, чтобы найти закономерность в случайности. А генераторы специально проверяются на то, чтобы быть идеальными с точки зрения статистики, в т.ч. в смысле отклонений - дисперсия, например, отнюдь не ноль.
    Переключение не поможет - статистика вещь упрямая и после триллиона все встанет куда надо.
    И кстати даже есть поставить "истинный" генератор, на основе радиоактвных материалов или квантовых эффектов - он выдаст еще лучшее равномерное распределение.
     
  5. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    А главная ошибка : ты меряешь случайность генератора, после того как отсортировал его реализации на 10 групп. Так это все и было придумано, чтобы из псевдо-случайности получить закономерную случайность. Можно найти такое число групп, когда уже "поломается" твой вихрь :)
     
  6. 2FED

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    Зачем изобретать велосепед? Всё давно включает в себя функция CryptGenRandom
     
  7. intel_x128

    intel_x128 New Member

    Публикаций:
    0
    Регистрация:
    17 май 2009
    Сообщения:
    345
    2FED
    1. CryptGenRandom в приложениях х32 на Осях х64 не всегда корректно работает.
    От данной функции пришлось отказаться.
    2. Вихрь Мерсена в разы быстрее штатных Вин-средств.
     
  8. botmen

    botmen Member

    Публикаций:
    0
    Регистрация:
    2 сен 2007
    Сообщения:
    43
    ты хэшируешь (приводишь к меньшему множеству)
    посмотри в каком районе числа наиболее компактно лезут, вот его и разделяй на десять. как-то так