PDA

Просмотр полной версии : Ищу наиболее естественный seed random алгоритм.


Tr1te
27.03.2012, 22:08
Посоветуйте, пожалуйста, наиболее точный seed randomizer алгоритм.
Требования простые... :)
Чтобы был наиболее естественным.

Последний, который посмотрел, самый простой и быстрый, и наиболее естественно выглядящий генератор выглядит так:

curSeed = (curSeed * 16807) % 2147483647;
return curSeed / 0x7FFFFFFF + 0.000000000233;

strangedk
27.03.2012, 22:33
Из текущих секунд доставать, например

Tr1te
27.03.2012, 22:48
Эй, каких секунд, надо же Seed random.

strangedk
27.03.2012, 23:15
прощу прощения, прочитал как "мне нужен мега случайный рандомайзер" :)

Котяра
27.03.2012, 23:50
естественно выглядящий
А можно более формализированные критерии?

Tr1te
27.03.2012, 23:58
Конечно...
Выше упомянотому генератору ставлю вероятность выпадения нужного числа 0.000026% что равно 1/3841314.
Делаю цикл из 3841314 итерации, и смотрю сколько раз выпало число меньше 0.000026, и это число выпадает больше 1 раза, я бы даже сказал больше 30 раз. Как то многовато. В среднем от 20-40. Хотелось бы видеть значение максималбно приближенное к 1.

wvxvw
28.03.2012, 02:45
Я не уверен откуда алгоритм, но есть предчувствие, что в оригинале использовался double а не float. Поэтому и результат такой.
А нужно это для криптографии, или для просчета каких-нибудь игровых вещей, где предсказуемость не играет роли? Я просто думал, а что если просто найти один сид, который удовлетворяет условию и его и использовать, если конечно, предсказуемость не важна.

Tr1te
28.03.2012, 09:45
Да нет, как в оригинале (http://lab.polygonal.de/?p=162).
Играет роль, сид генериться случайно, по другому алгоритму. Так что подобрать идеальный сид... нет.

Добавлено через 1 час 23 минуты
PS: Что-то я наврал, по поводу выпадения "В среднем от 20-40" при шансе 1/3841314. До этого считал на глаз, значений было больше 5 и я уже даже не сильно обращал внимание на точное кол-во. Сейчас посчитал точно, и все генераторы в среднем выдают от 90-110 выпадений, при шансе 1/3841314. Лучшие выдают от 90-100.

И решение как бы очевидное, чтобы получить шанс 1/3841314, надо просто пороговое значение (0.000026%) разделить еще на 100, и получаю то что надо. Но вот только я задумался, а в жизни то как, может 100 раз выпадение это так и должно быть? Бред...

i.o.
28.03.2012, 11:13
http://en.wikipedia.org/wiki/Xorshift

maxkar
28.03.2012, 11:22
Лучшие выдают от 90-110.
Они правы!

Вы не учитываете, что 1 == 100%, отсюда и проблема. 1/3841314 == 0.000026 == 0.0026%

Tr1te
28.03.2012, 11:34
Они правы!

Вы не учитываете, что 1 == 100%, отсюда и проблема. 1/3841314 == 0.000026 == 0.0026%
Конечно же. Спасибо большое. Только не в ту сторону точку сдвинули.

http://en.wikipedia.org/wiki/Xorshift
Он тоже был в списке проверяемых.

i.o.
28.03.2012, 11:36
Еще такой вариант - http://www.jstatsoft.org/v08/i14/paper

maxkar
28.03.2012, 11:58
Только не в ту сторону точку сдвинули.
Ой! Неправильно скопировал, там на пару нулей везде больше должно быть.

1/3841314 == 0.00000026 == 0.000026%