Вверх ↑
Этот топик читают: Гость
Ответов: 1263
Рейтинг: 47
#1: 2021-11-08 15:57:03 ЛС | профиль | цитата
Насколько статистически равномерным будет псевдослучайное распределение генератора псевдослучайных чисел (ГПСЧ) при смене сида на каждую новую генерацию случайного числа и его полном перезапуске с новым сидом? То есть генерировать по одному числу каждый раз с новым сидом с полностью перезапущенным ГПСЧ.

Редактировалось 1 раз(а), последний 2021-11-08 15:57:42
карма: 3
Hiasm + Flowstone + CopperCube + GoDot + JS
0
vip
#1.1контекстная реклама от партнеров
Ответов: 8888
Рейтинг: 823
#2: 2021-11-08 19:18:18 ЛС | профиль | цитата
Aziz, смысла в переустановке генератора случайных (псевдослучайных) чисел нет, достаточно одного при запуске программы. Более того, кроме лишнего времени, вы рискуете получить повторяющийся набор чисел на выходе, уж не говоря от том, что зашифрованные таким образом данные вы сами расшифровать не сможете
карма: 19

0
Ответов: 1263
Рейтинг: 47
#3: 2021-11-09 01:56:21 ЛС | профиль | цитата
Леонид, есть смысл, мне не для шифрования, допустим мне нужно создать "случайное" но жестко детерминированное число, которое пользователи смогли бы однозначно воспроизвести, проверить подставив текущий сид, скажем, выигрышное число в лотерее. Я модифицировал компонент Random (в модах компонентов лежит уже) добавив точку для сброса генератора без перезапуска программы. Я конечно проверю равномерность графически, посмотрев какую картинку белого шума создает такой генератор, но это эмпирический метод, может кто уже обжигался на этом и знает теорию.
карма: 3
Hiasm + Flowstone + CopperCube + GoDot + JS
0
Ответов: 8888
Рейтинг: 823
#4: 2021-11-09 11:25:42 ЛС | профиль | цитата
Aziz, следует помнить, что в любых играх со случаем, любая стратегия проигрывает случаю.
Компьютерный генератор случайных чисел представляет набор не повторяющихся чисел от "0" до максимума (2^n-1) расставленных однажды и навсегда в случайном порядке и при обращении к нему выдаёт следующее по очереди число. Переустановка (по умолчанию используется число из счётчика "тиков" процессора) не меняет расстановки чисел, а меняет лишь номер следующего числа.
карма: 19

0
Ответов: 4621
Рейтинг: 746
#5: 2021-11-09 11:44:28 ЛС | профиль | цитата
Aziz писал(а):
которое пользователи смогли бы однозначно воспроизвести, проверить подставив текущий сид
Это реализуется подписью данных с помощью ассиметричного алгоритма. У тебя есть приватный ключ, которым генерируется подпись. У пользователей есть твой публичный ключ. С помощью него нельзя сгененрировать такую же подпись, но можно проверить правильность той, которую сгенерировал ты.
Вкладка "Инструменты"->"Криптография".
карма: 26

0
Ответов: 1263
Рейтинг: 47
#6: 2021-11-09 15:21:05 ЛС | профиль | цитата
Леонид, у меня там другая идея, пока не хочу ее публиковать. А разве инициализация с другим сидом не выдает другую последовательность генератора? Или просто сдвигает индекс - указатель и на следующие в ряду фиксированные "случайные" числа? Вроде указано что он стойкий, прошел тесты Die Hard.
Netspirit, нет, мне нужно именно простое целое число, оно будет использоваться в дальнейшем как указатель. Ну скажем, 10 пользователей, выиграл 3-й. И остальные захотят узнать почему именно 3-й, может кто-то подкрутил генератор? И тогда они смогут убедиться что нет, тк при заданном сиде последовательность генератора будет предопределенной. Мне же нужно просто убедиться что у всех 10 пользователей будут равные шансы, и что нет перекосов шансов в сторону например первых 5-ти, тк это будет несправедливо и нечестно.
карма: 3
Hiasm + Flowstone + CopperCube + GoDot + JS
0
Ответов: 8888
Рейтинг: 823
#7: 2021-11-09 16:06:23 ЛС | профиль | цитата
Aziz писал(а):
инициализация с другим сидом
А это зависит от того, что вы подразумеваете под термином "сид"
Если вы используете генератор встроенный в какой-либо язык (например в HiAsm), то применив функцию Rendomize вы "просто сдвигает индекс - указатель", а последовательность выдаваемых чисел остаётся неизменной.
Если вы используете свой, самопальный генератор и и термином "сид" обозначаете кодовое битовое слово используемое в побитном сравнении и изменение состояние генератора, то тогда, конечно, меняется вся последовательность выдаваемых чисел. Следует отметить, что таких "кодовых" слов, обеспечивающих полную функциональность генератора на все 2^n, не очень много и любое слово не подойдёт.
карма: 19

0
Ответов: 1263
Рейтинг: 47
#8: 2021-11-09 16:11:56 ЛС | профиль | цитата
Только что проверил - не работает. При сбросе и инициализации выдает одно и тоже псевдослучайное число. Что в общем-то неудивительно) Хотел использовать в качестве ГПСЧ последние цифры 0-9 в котировках евро, доллара и рубля из Гугла, но потом закралось сомнение в статистической равномерности их случайности... Придется что-то придумывать свое. Велосипед) Чтобы на основе одного числа - сида генерировалась статистически равномерная псевдослучайная величина.. Если это не бред, тк равномерность может наверно присутствовать только в пределах одной последовательности..
Леонид, сид - да, я с Хиасма и начал знакомство с ГПСЧ, поэтому это некое стартовое число, от которого зависит вся последдовательность.

Редактировалось 2 раз(а), последний 2021-11-09 16:18:10
карма: 3
Hiasm + Flowstone + CopperCube + GoDot + JS
0
Ответов: 8888
Рейтинг: 823
#9: 2021-11-09 21:00:40 ЛС | профиль | цитата
Aziz, При вводе одинакового числа в предустановку RND всегда выдаёт одинаковую последовательность чисел!
RND


Add(MainForm,2953706,133,49)
{
link(onCreate,11097079:doRandomize,[(184,69)(184,118)])
}
Add(Button,763752,133,105)
{
Left=60
Top=90
Caption="RND"
link(onClick,11097079:doRandom,[])
}
Add(Edit,701596,133,147)
{
Left=5
Top=10
Width=95
Text="14526365"
DataType=2
}
Add(BitBtn,7342443,84,196)
{
Left=5
Top=35
Width=100
Caption="Предустановка"
link(onClick,14769182:doData,[])
}
Add(Random,11097079,217,105)
{
Max=4
Mode=1
Point(doRandSeed)
link(onRandom,8513709:doOperation,[])
}
Add(Math,8513709,273,105)
{
OpType=2
Op2=4294967296
link(onResult,11987144:doEvent,[])
}
Add(DoData,14769182,133,196)
{
link(onEventData,11097079:doRandSeed,[(172,202)(172,125)])
link(Data,701596:Text,[])
}
Add(IndexToChanel,11987144,322,105)
{
Point(Data)
Point(Index)
link(onEvent1,6467756:doAdd,[(368,111)(368,90)])
link(onEvent2,13802150:doAdd,[(368,118)(368,139)])
link(Data,8513709:Result,[(328,96)(314,96)(314,145)(279,145)])
link(Index,14368194:Selected,[])
}
Add(ListBox,13802150,392,133)
{
Left=130
Top=25
Width=120
Height=230
}
Add(ListBox,6467756,392,84)
{
Left=260
Top=25
Width=120
Height=230
}
Add(Button,2462974,280,161)
{
Left=65
Top=220
Caption="Сброс"
link(onClick,8436666:doEvent1,[])
}
Add(Hub,8436666,329,161)
{
link(onEvent1,6467756:doClear,[(375,167)(375,97)])
link(onEvent2,13802150:doClear,[(382,174)(382,146)])
}
Add(RadioButton,14368194,329,28)
{
Left=180
Width=25
Selected=0
Caption=""
}
Add(RadioButton,13671644,378,28)
{
Left=300
Width=20
Caption=""
}

карма: 19

0
Ответов: 1263
Рейтинг: 47
#10: 2021-11-10 10:59:32 ЛС | профиль | цитата
Леонид, спасибо. Придется свой генератор видимо создавать на основе имеющегося. Вопрос как проверять его равномерность ? Графический метод в виде вывода точек на изображении самый наглядный но он не позволит точно оценить параметры. Наверное нужно заполнять массивы специально подготовленными данными и потом измерять процент их распределения.
карма: 3
Hiasm + Flowstone + CopperCube + GoDot + JS
0
Ответов: 8888
Рейтинг: 823
#11: 2021-11-10 11:38:29 ЛС | профиль | цитата
Aziz, полагаю, что вновь изобретённый велосипед будет, как минимум не лучше имеющегося
А имеется 32-х битный RND (4.2 миллиарда значений), кроме того в HiAsm есть и 128-битный RND (3.4*10^38 значений)
Функционал всех RND одинаков, необходим и достаточен -- обеспечивает повторяемость и отсутствие совпадающих значений.
карма: 19

0
Ответов: 1263
Рейтинг: 47
#12: 2021-11-10 19:35:38 ЛС | профиль | цитата
Леонид, мне нужен видимо специфический RND - я пока не понял как схемой на основе штатного RND реализовать следующий функционал:

1) В качестве сида берется текущая дата, приведенная в формат Real - получаем однозначное число, меняющееся каждый день.
2) С помощью этого сида генерируется случайное число, скажем, в интервале 1 - 100 в случае 100 пользователей, соответствующий пользователь становится победителем.
А остальные смогут проверить истинность числа, подставив текущую дату в ГПСЧ в своем приложении.
3) На следующий день, на основе нового сида полученного из даты, генерируется следующее случайное число, но оно должно быть статистически равномерно случайно распределено относительно уже выпавших ранее в этом месяце чисел. Цикл или период генератора можно сделать 30 дней.

И вот тут проблема, понятно что можно каждый раз новое число сгенерировать, но как обеспечить его равномерность и верифицируемость пока неясно. Каждое новое число статистически будет не связано с предыдущим и вполне может вызвать повторы или наоборот пробелы в числах, "мертвые зоны", числа где участники будут иметь наименьшую вероятность выигрыша.
А просто выдавать числа из генератора с периодом в 30 дней без верификации не вызовет доверия в нашу эпоху электронных лохотронов)
карма: 3
Hiasm + Flowstone + CopperCube + GoDot + JS
0
Ответов: 8888
Рейтинг: 823
#13: 2021-11-10 21:59:35 ЛС | профиль | цитата
Aziz, ваш алгоритм с предустановкой по дате не годится -- все пользователи наперёд будут знать что выпадет на любой день
карма: 19

0
Ответов: 1263
Рейтинг: 47
#14: 2021-11-10 22:03:05 ЛС | профиль | цитата
Леонид, так и знал что к этому придеретесь)) Очевидно слабое место в безопасности и логике.
Это просто пример. Если уж заморочиться на эту тему то можно сделать так чтобы прога брала время с ntp сервера в инете и не позволяла неверную дату вводить) И даже если узнают то сути это не изменит в моем проекте) Суть вопроса не в этом а в равномерности и верифицируемости.
Вообще открыл для себя интересное направление экспериментов, узнав насколько сложно и даже невозможно создание по-настоящему случайного числа программой.

Редактировалось 3 раз(а), последний 2021-11-10 22:06:11
карма: 3
Hiasm + Flowstone + CopperCube + GoDot + JS
0
Ответов: 8888
Рейтинг: 823
#15: 2021-11-11 10:51:09 ЛС | профиль | цитата
Aziz, ну не так это делается! выбираете в качестве предустановки не дату, а любое число<2147483648, это число шифруете с каким-либо ключом и высылаете всем подписчикам. После розыгрыша публикуете ключ, ваши подписчики расшифровывают это число и вводят его в RND и все видят кто выиграл
(Все RND генерируют не чисто случайное число, но "псевдослучайное", одно из ряда неповторяющихся чисел. До компьютеров были специальные ГОСТ-ы с такими таблицами )

Редактировалось 1 раз(а), последний 2021-11-11 10:58:16
карма: 19

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)