Собственно, генератор в волатиле, наговнянный по-быстрому и основанный на rand(), меня не устраивает, потому что он не портабельный и в разных компиляторах ведёт себя по-разному, да и длина серии rand() оставляет желать лучшего.
В ку3, скажем, используется очень просто линейный конгруэнтный метод (ЛКМ), что считается предсказуемым и вообще плохим. (rand, кстати, тоже обычно ЛКМ, хотя это остаётся на усмотрение автора библиотеки CRT/LIBC).
Единственный известный мне нормальный альтернативный генератор - в Xash3D - это по сути генератор из сорцов бетки хл2 (c перебитым копирайтом...). Мне даже удалось узнать, что автор генератора из бетки - и вовсе не Valve, а товарищи Press и Teukolsky, а Valve внесла кое-какие модификации косметической формы. Алгоритм также опубликован в Numeric Recipes (NR) (возвращаясь к копирайтам в ксаше - атата, Дядя Миша, у Numeric Recipes очень анальная лицензия!) Но пока не могу найти оригинальную статью (может, у кого есть?)
Цитата:
W.H. Press, S.A. Teukolsky "Portable random number generators" // Comput. Phys. - 1992. - V. 6. - N 5. - P. 522-524.
Я нашёл работу, которая развивает их идеи (Marsaglia, Zaman, 1994), но хотелось бы докопаться до оригинала.
А просто так юзать код из этой статьи не хочу именно из-за анальности NR (к коей он и привязан). В общем, нужны оригинальные статьи, на которые будут ссылки, а не NR.
Собственно, вопросы такие:
1) Чем плох ЛКМ, помимо предсказуемости (ок, это важно для сетевой шифровки, где генерится ключ, но в основном в игровом процессе - не особо)?
2) Используете ли вы Монте-Карло?
3) Вне зависимости от ответа на вопрос 2, какой генератор псевдослучайных чисел используете вы и почему?
Да без разницы -- я занимаюсь и волатилой, и молекулярной динамикой параллельно, вы же знаете.
Но всё же желательно быстрый.
Добавлено 19-01-2014 в 21:45:
Да, кстати, речь только о uniform-генераторах.
Добавлено 19-01-2014 в 21:46:
Кстати, генератор из бетки вот тут также почему-то называется "линейным конгруэнтным", хотя из кода это совершенно не очевидно, там как-то хитро всё...
ну я у себя его просто rand() подобным образом переиницализирую. а монтекарло у меня для расчёта столкновений частиц между собой.
>молекулярной динамикой
оно ж, кстати, очень близко к PiC, только в твоём случае, насколько я помню, частица действует только на ближайших соседей, а в PiC -- на весь коллектив.
у тебя двухмерная или трёхмерная геометрия? как сортируешь частицы/дефрагментируешь массив, на каждом шаге?
thambs писал: у тебя двухмерная или трёхмерная геометрия? как сортируешь частицы/дефрагментируешь массив, на каждом шаге?
Трёхмерная. Кол-во частиц постоянно (NTP-ансамбль).
Да это не важно, мне сейчас конкретно для волатилы надо, я просто сразу пишу код с учётом того, что он может понадобиться в "серьёзных проектах", где принято цитировать источники.
>(NTP-ансамбль).
эт. что то из биологии. а можешь примерно назвать сколько по порядку частиц в системе, и размеры сетки?
>остальное аппроксимируется, угу.
ур-ем пуассона?
>Кол-во частиц постоянно
граничные условия что ли периодические?
>Да это не важно
ну интересно ж про работу узнать
>как сортируешь частицы/дефрагментируешь массив
ну я к тому, как ты различаешь ближние и дальние. или просто хранишь отдельный массив с индексами вместо пересортировки? а сколько Мб/Гб занимает вся функция распределения?
thambs писал: а можешь примерно назвать сколько по порядку частиц в системе, и размеры сетки?
Порядок 10^4-10^5, больше требуется крайне редко (число атомов в глобулярном белке - порядка нескольких тысяч, вот если явный растворитель - ситуация меняется).
Цитата:
thambs писал: ур-ем пуассона?
Хе-хе, если бы. По-разному. Если без явной воды - то generalized Born обычно.
Цитата:
thambs писал: граничные условия что ли периодические?
Пока нет, т.к. растворитель неявный.
С явным буду делать периодические, и вместо аппроксимации - суммирование по Эвальду, это стандарт, в общем-то, уже пару-тройку десятков лет.
Цитата:
thambs писал: ну я к тому, как ты различаешь ближние и дальние.
Они редко обновляются, так как в МД (биологической, по крайней мере) нет быстрых и резких переходов. STL-контейнеров пока хватает, как я уже сказал, размеры системы невелики.
В МД рандомы нужны для начальных скоростей и прочих стартовых корректив для преодоления локальных энергетических барьеров, а к Монте-Карло я так, пока присматриваюсь.
XaeroX бери из system32 любой файл и читай первые четыре символа, затем читай еще один файл, и вычитай один инт из другого.
Получившееся число врапом используй для открытия третьего файла в папке system32, читай оттуда raw дату, сложив два предидущих инта (тоже с врапом, чтоб не вылезти за размер файла) - будет тебе полурандом
Номера первого и второго файла можно например вычислить из текущей даты и текущего времени. (это для первого раза). А потом прибавлять к ним те самые смещения, которые случайно прочлись из того или иного файла.