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

Генератор псевдослучайных чисел (ГПСЧ)

Проще говоря нужна функция rand_value(int seed, int index).

Все ГПСЧ, что я видел, при генерации нового значения используют в качестве зерна предыдущее, либо модифицируют собственные задающие значения.

Поэтому получение n+1 числа в последовательности невозможно без расчёта предыдущих n чисел.

Мне же нужно получить произвольное число в последовательности без расчёта предыдущих.

Есть ли такие генераторы? Если нет, то что можно придумать?

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


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

Есть ли такие генераторы? Если нет, то что можно придумать?

 

Не видал, но есть простой метод решения. Берете какой-нибудь алгоритм шифрования (например DES), и шифруете ключем seed открытый текст index. На выходе получаете случайные числа. Либо берете хэш-функцию (например, MD5) от композиции seed и index.

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


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

Не видал, но есть простой метод решения. Берете какой-нибудь алгоритм шифрования (например DES), и шифруете ключем seed открытый текст index. На выходе получаете случайные числа. Либо берете хэш-функцию (например, MD5) от композиции seed и index.

 

Отличный вариант! Если не найду нужный ГПСЧ, то так и сделаю. Спасибо! ))

 

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


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

Что мешает заполнить таблицу нужного размера от ГСЧ, а затем по индексу извлекать? :)

Даже если всю память контроллера займу таблицей, периодичность повторения ПСП будет для меня очень маленькой (

 

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


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

Гость TSerg

Ну, хорошо. А открытый текст где держать? На большом брате и передавать по Wi-Fi? :)

Вы задачу поточнее изложите, а то фантазий много возникает.

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


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

Выдумывайте функцию rng = f(seed, index) и проверяйте с помощью diehard test battery последовательность получившихся значений rng для index, который инкрементируется.

 

В основу f( a, b ) удобно положить, как уже написал Rst7, какой-нибудь готовый шифратор или кодер от простой комбинации битов seed и index.

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


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

Ну, хорошо. А открытый текст где держать? На большом брате и передавать по Wi-Fi? :)

Вы задачу поточнее изложите, а то фантазий много возникает.

Время (индекс значения в последовательности) и ключ/полином, по условиям задачи, синхронизируются один раз в "безопасной среде".

Одинаковые значения должны синхронно формироваться на обоих устройствах для поддержания связи между собой.

Задача получения n-го значения последовательности выплывает из-за необходимости периодического восстановления синхронизма.

Это если вкратце.

 

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


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

Аналоговый генератор шума + АЦП. Хотя дополнительное железо мне не нравится, но для полноты картины...

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


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

Гость TSerg
Аналоговый генератор шума + АЦП. Хотя дополнительное железо мне не нравится, но для полноты картины...

 

В этом случае никакой синхронизации не будет в принципе, а она ТС нужна.

 

P.S.

Если возникает рассинхронизация, то использовать передачу slave-девайсу нового значения seed и начинать синхронную генерацию ПСП (reset с новым seed).

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


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

Вопрос, может уже не в эту тему...

Последовал совету вычислять md5 от комбинации времени и индекса.

Время вычисления md5 на целевом камне - 15.17 мкс.

Зато алгоритм хэша "MurmurHash2" - 0.59 мкс.

Предел 1 мкс.

Кто-нибудь слышал про MurmurHash2? И есть ли альтернативная и быстрая хэш функция?

 

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


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

Альтернативная обязательно есть: любая функция с выходом фиксированной разрядности, зависящим от входа.

 

А мурмур-то почему не подходит?

 

xxhash посмотрите, но не думаю, что там кардинальные отличия по части быстродействия

 

И есть ли альтернативная и быстрая хэш функция?

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


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

Альтернативная обязательно есть: любая функция с выходом фиксированной разрядности, зависящим от входа.

 

А мурмур-то почему не подходит?

 

xxhash посмотрите, но не думаю, что там кардинальные отличия по части быстродействия

 

мурмур как раз подходит! Тест на равномерность распределения, применительно к задаче, дал отличный результат.

За совет спасибо, xxhash тоже думаю потестировать.

 

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


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

Тест на равномерность распределения не стоит и ломаного сентаво.

 

пример: rng = 0,1,2,3, 0,1,2,3, 0,1,2,3, ... имеет равномерное распределение в диапазоне [0; 3]

 

Я писал вам, чем проверяются RNG.

 

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

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


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

Тест на равномерность распределения не стоит и ломаного сентаво.

 

пример: rng = 0,1,2,3, 0,1,2,3, 0,1,2,3, ... имеет равномерное распределение в диапазоне [0; 3]

 

Я писал вам, чем проверяются RNG.

 

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

Тест последовательностей по дайхарду (Runs Test):

49.76 - 49.82-% восходящих последовательностей для разных сидов. Покатит.

Тест Birthday Spacings ещё кажется интересным.

Идею понял. Благодарю!

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


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

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

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

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

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

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

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

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

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

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