fsergey
Jan 28 2014, 06:47
Проще говоря нужна функция rand_value(int seed, int index).
Все ГПСЧ, что я видел, при генерации нового значения используют в качестве зерна предыдущее, либо модифицируют собственные задающие значения.
Поэтому получение n+1 числа в последовательности невозможно без расчёта предыдущих n чисел.
Мне же нужно получить произвольное число в последовательности без расчёта предыдущих.
Есть ли такие генераторы? Если нет, то что можно придумать?
QUOTE
Есть ли такие генераторы? Если нет, то что можно придумать?
Не видал, но есть простой метод решения. Берете какой-нибудь алгоритм шифрования (например DES), и шифруете ключем seed открытый текст index. На выходе получаете случайные числа. Либо берете хэш-функцию (например, MD5) от композиции seed и index.
fsergey
Jan 28 2014, 07:30
Цитата(Rst7 @ Jan 28 2014, 10:10)

Не видал, но есть простой метод решения. Берете какой-нибудь алгоритм шифрования (например DES), и шифруете ключем seed открытый текст index. На выходе получаете случайные числа. Либо берете хэш-функцию (например, MD5) от композиции seed и index.
Отличный вариант! Если не найду нужный ГПСЧ, то так и сделаю. Спасибо! ))
Что мешает заполнить таблицу нужного размера от ГСЧ, а затем по индексу извлекать?
fsergey
Jan 28 2014, 09:39
Цитата(TSerg @ Jan 28 2014, 10:41)

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

Даже если всю память контроллера займу таблицей, периодичность повторения ПСП будет для меня очень маленькой (
Ну, хорошо. А открытый текст где держать? На большом брате и передавать по Wi-Fi?

Вы задачу поточнее изложите, а то фантазий много возникает.
Fat Robot
Jan 28 2014, 10:01
Выдумывайте функцию rng = f(seed, index) и проверяйте с помощью diehard test battery последовательность получившихся значений rng для index, который инкрементируется.
В основу f( a, b ) удобно положить, как уже написал Rst7, какой-нибудь готовый шифратор или кодер от простой комбинации битов seed и index.
fsergey
Jan 28 2014, 11:34
Цитата(TSerg @ Jan 28 2014, 12:50)

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

Вы задачу поточнее изложите, а то фантазий много возникает.
Время (индекс значения в последовательности) и ключ/полином, по условиям задачи, синхронизируются один раз в "безопасной среде".
Одинаковые значения должны синхронно формироваться на обоих устройствах для поддержания связи между собой.
Задача получения n-го значения последовательности выплывает из-за необходимости периодического восстановления синхронизма.
Это если вкратце.
Tarbal
Jan 28 2014, 12:37
Аналоговый генератор шума + АЦП. Хотя дополнительное железо мне не нравится, но для полноты картины...
Цитата(Tarbal @ Jan 28 2014, 16:37)

Аналоговый генератор шума + АЦП. Хотя дополнительное железо мне не нравится, но для полноты картины...
В этом случае никакой синхронизации не будет в принципе, а она ТС нужна.
P.S.
Если возникает рассинхронизация, то использовать передачу slave-девайсу нового значения seed и начинать синхронную генерацию ПСП (reset с новым seed).
fsergey
Jan 28 2014, 17:35
Вопрос, может уже не в эту тему...
Последовал совету вычислять md5 от комбинации времени и индекса.
Время вычисления md5 на целевом камне - 15.17 мкс.
Зато алгоритм хэша "MurmurHash2" - 0.59 мкс.
Предел 1 мкс.
Кто-нибудь слышал про MurmurHash2? И есть ли альтернативная и быстрая хэш функция?
Fat Robot
Jan 28 2014, 18:24
Альтернативная обязательно есть: любая функция с выходом фиксированной разрядности, зависящим от входа.
А мурмур-то почему не подходит?
xxhash посмотрите, но не думаю, что там кардинальные отличия по части быстродействия
Цитата(fsergey @ Jan 28 2014, 18:35)

И есть ли альтернативная и быстрая хэш функция?
fsergey
Jan 28 2014, 18:54
Цитата(Fat Robot @ Jan 28 2014, 22:24)

Альтернативная обязательно есть: любая функция с выходом фиксированной разрядности, зависящим от входа.
А мурмур-то почему не подходит?
xxhash посмотрите, но не думаю, что там кардинальные отличия по части быстродействия
мурмур как раз подходит! Тест на равномерность распределения, применительно к задаче, дал отличный результат.
За совет спасибо, xxhash тоже думаю потестировать.
Fat Robot
Jan 28 2014, 19:15
Тест на равномерность распределения не стоит и ломаного сентаво.
пример: rng = 0,1,2,3, 0,1,2,3, 0,1,2,3, ... имеет равномерное распределение в диапазоне [0; 3]
Я писал вам, чем проверяются RNG.
С другой стороны, если у вас все хорошо, то пусть так и будет. равномерно хорошо.
fsergey
Jan 28 2014, 20:04
Цитата(Fat Robot @ Jan 28 2014, 23:15)

Тест на равномерность распределения не стоит и ломаного сентаво.
пример: rng = 0,1,2,3, 0,1,2,3, 0,1,2,3, ... имеет равномерное распределение в диапазоне [0; 3]
Я писал вам, чем проверяются RNG.
С другой стороны, если у вас все хорошо, то пусть так и будет. равномерно хорошо.
Тест последовательностей по дайхарду (Runs Test):
49.76 - 49.82-% восходящих последовательностей для разных сидов. Покатит.
Тест Birthday Spacings ещё кажется интересным.
Идею понял. Благодарю!
Tarbal
Jan 29 2014, 15:09
Цитата(TSerg @ Jan 28 2014, 17:05)

В этом случае никакой синхронизации не будет в принципе, а она ТС нужна.
P.S.
Если возникает рассинхронизация, то использовать передачу slave-девайсу нового значения seed и начинать синхронную генерацию ПСП (reset с новым seed).
Да, увлекся.
Ну тогда М-последовательность самое то, что надо. И предопределенная и абсолютно неавтокоррелируемая.
fsergey
Jan 30 2014, 04:44
Цитата(Tarbal @ Jan 29 2014, 18:09)

Да, увлекся.
Ну тогда М-последовательность самое то, что надо. И предопределенная и абсолютно неавтокоррелируемая.
Обращал внимание на М-последовательность, но она не позволяет вычислить n+1 элемент без вычисления n предыдущих. Поэтому отказался.
Позволяет, если в качестве исходного состояния взять n-е, тогда на след шаге получим n+1.
Task Solver
Jan 30 2014, 18:47
Рассмотрим группу по умножению по модулю 2^32 она изоморфна декартову произведению двух групп по сложению по модулям 2^30 и 2. В исходной группе ровно 2^31 элемент, все нечётные. Видно, что самый длинный цикл в ней равен 2^30, такой элемент не сложно найти перебором, их там очень много, пусть такое число - A.
Далее случайное число формируется по формуле: (A^k)*B.
B - это какой то любой элемент группы (нечёное число), имеют смысл только 1 и 3, остальные получаются сдвигом степени.
Его легко посчитать используя разложение степени на сумму степеней двойки, просто анализируя двоичное представление.
k=53=(110101)
A^53=A*A^52=A*(A*A)^26=A*((A*A)^2)^13=...
Сепени равные 0, 1, 2, 4, 8, 16, 32, ... 2^29 можно заранее посчитать и записать в таблицу. Потом согласно битам k перемножить.
В качестве случайного числа взять 30 старших битов (или их подстроку), потому что младший бит всегда 1, а не самый младший тоже вроде постоянен.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.