HLFX.Ru Forum (https://hlfx.ru/forum/index.php)
- Технические вопросы (https://hlfx.ru/forum/forumdisplay.php?forumid=20)
-- Random numbers generator (https://hlfx.ru/forum/showthread.php?threadid=4247)
Отправлено Crystallize 20-01-2014 в 13:00:
http://qrng.anu.edu.au
Отправлено XaeroX 20-01-2014 в 13:09:
В общем, я сконструировал свой конгруэнтный генератор на основе мултипликативного и AWC-генератора. Он немного быстрее и немного чотче хл2шного, а главное - никаких копирайтов, можно вешать свой.
Шутко. На самом деле главное - это период. У бетковского он 2^32, а у меня 2^32*2^58=2^90. Серии должны быть гораздо длиннее. Осталось его как следует потестить. И я не совсем уверен в правильности выбора стартовых семечек, возможно, этот момент можно сделать лучше.
Если кому интересно - могу выложить с пояснениями.
__________________
Отправлено Government-Man 20-01-2014 в 14:01:
Цитата:
XaeroX писал:
Если кому интересно - могу выложить с пояснениями.
Интересно, выкладывай. Я раньше интересовался генерацией псевдослучайных чисел.
Отправлено XaeroX 20-01-2014 в 14:17:
Цитата:
Government-Man писал:
Я раньше интересовался генерацией псевдослучайных чисел.
А чего перестал?
Добавлено 20-01-2014 в 21:17:
Government-Man
А у тебя статьи случаем нет, что я в первом посте упомянул? Раз интересовался, то наверняка же читал что-то по теме?__________________
Отправлено Дядя Миша 20-01-2014 в 14:58:
XaeroX он предиктабельный у тебя? seed поддерживает?
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено XaeroX 20-01-2014 в 15:12:
Цитата:
Дядя Миша писал:
он предиктабельный у тебя?
Что ты понимаешь под "предиктабельным"?
Цитата:
Дядя Миша писал:
seed поддерживает?
Ему три сида надо, я их делаю из одного (time(NULL)) путём прогона через вариант мультипликативного генератора, и вот не совсем уверен, нормально ли это. Впрочем, сиды мало на что влияют, распределение всегда вполне равномерное.__________________
Отправлено Government-Man 20-01-2014 в 15:39:
Цитата:
XaeroX писал:
А чего перестал?
Я не перестал, просто в свое время читал какие-то статьи по теме, но в итоге решил не заморачиваться и свою имплементацию пока не писать, а просто поставил заглушку с rand() - для игрушек хватает, для более серьезных проектов придется переписывать конечно.
Цитата:
XaeroX писал:
А у тебя статьи случаем нет, что я в первом посте упомянул? Раз интересовался, то наверняка же читал что-то по теме?
Читал да, но искомой статьи не припомню. У меня были какие-то статьи в PDF, надо бы глянуть. Ну я Кнута еще читал, но там как-раз про ЛКМ.
Отправлено XaeroX 20-01-2014 в 16:51:
Ну что ж, вот мой генератор
C++ Source Code:
1 | // Random generator, author: XaeroX, 2014 |
2 | // Part of Volatile3D II Engine source code |
4 | // Creative Commons Attribution-Noncommercial-Share Alike |
5 | // http://creativecommons.org/licenses/by-nc-sa/4.0/ |
7 | // could be local statics, but we reference them |
8 | // in two subroutines: srand and rand |
9 | // the initial values are arbitrary unsigned ints |
10 | static unsigned int awc0 = 0xf6a3d9; |
11 | static unsigned int awc1 = 0x159a55e5; |
12 | static unsigned int mult = 0x436cbae9; |
13 | static unsigned int carry = 1; |
15 | void xrxSRand( unsigned int seed ) |
17 | // default seed comes from system timers |
18 | if ( !seed ) seed = ( unsigned int )time( NULL ); |
20 | // initialize AWC and multiplicative seeds |
21 | awc0 = 0x10dcd * seed + 0xf6a3d9; |
22 | awc1 = 0x10dcd * seed + 0x159a55e5; |
23 | mult = seed & 0x7fffffff; |
25 | // carry flag initial value depends on awc seeds |
26 | carry = ( awc0 > awc1 ) ? 0 : 1; |
29 | unsigned int xrxRand( void ) |
32 | unsigned int awc = awc1 + ( awc0 + carry ); |
33 | carry = ( awc > awc0 ) ? 0 : 1; |
34 | awc1 = awc0; awc0 = awc; |
36 | // run multiplicative generator |
37 | mult = 0x10dcd * mult + 0x3c6ef373; |
39 | // return random value |
43 | int Com_RandomLong( int low, int high ) |
45 | static bool init = false; |
46 | unsigned int randNumber; |
47 | unsigned int randRange = high - low + 1; |
49 | assert( high >= low ); |
59 | // remapping to desired range keeping random value uniformly distributed |
60 | unsigned int maxAcceptable = 0xfffffffe - ( 0xffffffff % randRange ); |
61 | do randNumber = xrxRand(); while ( randNumber > maxAcceptable ); |
63 | return low + ( randNumber % randRange ); |
66 | float Com_RandomFloat( float low, float high ) |
68 | static bool init = false; |
70 | float randRange = high - low; |
72 | assert( high >= low ); |
82 | randNumber = 0.2328306437e-9f * xrxRand(); |
83 | return low + randNumber * randRange; |
Из комментариев должно быть понятно, что и как работает.
Этот генератор примерно на 7% быстрее хл2шного (мелочи, ок) и более чем в 2 раза быстрее CRT-шного rand().
Но код, полагаю, намного понятнее и читабельнее.
Если что, задавайте вопросы. Если что-то не работает, или заметили косяк/опечатку - сообщайте.
Извиняюсь за анальную лицензию, но мало ли кто этот код нагуглит... время нынче непростое.
Потом, когда волатила станет GPL, этот код тоже будет GPL, а пока вот так.__________________
Отправлено Дядя Миша 20-01-2014 в 17:21:
Цитата:
XaeroX писал:
Что ты понимаешь под "предиктабельным"?
Очень просто, при одинаковом заданном диапазоне и совпадающем сиде всегда будет генерироваться одно и то же псевдослучайное число.
Для чего это нужно ты и сам знаешь - предиктинг випонсов, травку расставлять, да мало ли. Точнее тут смысл в том даже, что не просто одинаковое случайное число. Одна и та же последовательность случайных чисел. Это важнейшее свойство любого генератора такого типа.
Цитата:
XaeroX писал:
Ну что ж, вот мой генератор
А RandomFloat?__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено XaeroX 20-01-2014 в 19:01:
Цитата:
Дядя Миша писал:
Очень просто, при одинаковом заданном диапазоне и совпадающем сиде всегда будет генерироваться одно и то же псевдослучайное число.
Ну это само собой.
Цитата:
Дядя Миша писал:
Для чего это нужно ты и сам знаешь
Знаю, в волатиле юзается предиктабельный рандом.
Я просто подумал, что это какой-то математический термин.
Цитата:
Дядя Миша писал:
А RandomFloat?
Пока не написал. 
Позже будет. Он всё равно основывается на этой же функции.
Добавлено 21-01-2014 в 02:01:
Ага, дописал RandomFloat, обновил пост.
Она, кстати, немного медленнее, чем хл2шная (примерно на те же 7%, причём загадка, из-за чего, видимо, компилятор чудит при генерации кода), но всё равно быстрее rand().__________________
Отправлено Government-Man 17-04-2014 в 10:14:
Кстати в C++11 появилась отличная библиотека <random> с кучей алгоритмов и распределений (и возможностью подключать свои), собственно там весьма винрарный вихрь мерсенна идет из коробки.
Производительность только надо б замерить, но мне чет лень. 
Отправлено XaeroX 17-04-2014 в 10:27:
Цитата:
Government-Man писал:
C++11
Его кто-то использует? 
__________________
Отправлено Government-Man 17-04-2014 в 10:34:
Цитата:
XaeroX писал:
Его кто-то использует?
А то!
Отправлено thambs 26-05-2016 в 21:12:
Извиняюсь за поднятие старой темы. А как сослаться на http://hlfx.ru/forum/showthread.php...1218#post131218 если я хочу использовать эту имплементацию?
__________________
http://www.moddb.com/mods/monorail-quest
Отправлено XaeroX 27-05-2016 в 04:31:
thambs
В исходниках - можешь прям эту ссылку в комментариях и разместить.
В статье - ссылайся на оригинальные работы. Моя реализация, по сути, на основе их идей.
Цитата:
Press, W. H. and S. A. Teukolsky (1992). "Portable Random Number Generators." Comput. Phys. 6(5): 522-524.
Marsaglia, G. and A. Zaman (1994). "Some portable very-long-period random number generators." Comput. Phys. 8(1): 117-121.
Могу дать pdf-ки, если нужно.