HLFX.Ru Forum Страницы (4): « 1 2 [3] 4 »
Показать все 48 сообщений этой темы на одной странице

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. Серии должны быть гораздо длиннее. Осталось его как следует потестить. И я не совсем уверен в правильности выбора стартовых семечек, возможно, этот момент можно сделать лучше.
Если кому интересно - могу выложить с пояснениями.

__________________

xaerox on Vivino


Отправлено Government-Man 20-01-2014 в 14:01:

Цитата:
XaeroX писал:
Если кому интересно - могу выложить с пояснениями.


Интересно, выкладывай. Я раньше интересовался генерацией псевдослучайных чисел.


Отправлено XaeroX 20-01-2014 в 14:17:

Цитата:
Government-Man писал:
Я раньше интересовался генерацией псевдослучайных чисел.

А чего перестал?

Добавлено 20-01-2014 в 21:17:

Government-Man
А у тебя статьи случаем нет, что я в первом посте упомянул? Раз интересовался, то наверняка же читал что-то по теме?

__________________

xaerox on Vivino


Отправлено Дядя Миша 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)) путём прогона через вариант мультипликативного генератора, и вот не совсем уверен, нормально ли это. Впрочем, сиды мало на что влияют, распределение всегда вполне равномерное.

__________________

xaerox on Vivino


Отправлено 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
3
// Code license:
4
// Creative Commons Attribution-Noncommercial-Share Alike
5
// http://creativecommons.org/licenses/by-nc-sa/4.0/
6
 
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;
14
 
15
void xrxSRand( unsigned int seed )
16
{
17
  // default seed comes from system timers
18
    if ( !seed ) seed = ( unsigned int )time( NULL );
19
 
20
  // initialize AWC and multiplicative seeds
21
  awc0 = 0x10dcd * seed + 0xf6a3d9;
22
  awc1 = 0x10dcd * seed + 0x159a55e5;
23
  mult = seed & 0x7fffffff;
24
 
25
  // carry flag initial value depends on awc seeds
26
  carry = ( awc0 > awc1 ) ? 0 : 1;
27
}
28
 
29
unsigned int xrxRand( void )
30
{
31
  // run AWC-generator
32
  unsigned int awc = awc1 + ( awc0 + carry );
33
  carry = ( awc > awc0 ) ? 0 : 1;
34
  awc1 = awc0; awc0 = awc;
35
 
36
  // run multiplicative generator
37
  mult = 0x10dcd * mult + 0x3c6ef373;
38
 
39
  // return random value
40
  return awc + mult;
41
}
42
 
43
int Com_RandomLong( int low, int high )
44
{
45
  static bool init = false;
46
  unsigned int randNumber;
47
  unsigned int randRange = high - low + 1;
48
 
49
  assert( high >= low );
50
 
51
  if ( randRange <= 1 )
52
    return low;
53
 
54
  if ( !init ) {
55
    xrxSRand( 0 );
56
    init = true;
57
  }
58
 
59
  // remapping to desired range keeping random value uniformly distributed
60
  unsigned int maxAcceptable = 0xfffffffe - ( 0xffffffff % randRange );
61
  do randNumber = xrxRand(); while ( randNumber > maxAcceptable );
62
 
63
  return low + ( randNumber % randRange );
64
}
65
 
66
float Com_RandomFloat( float low, float high )
67
{
68
  static bool init = false;
69
  float randNumber;
70
  float randRange = high - low;
71
 
72
  assert( high >= low );
73
 
74
  if ( randRange <= 0 )
75
    return low;
76
 
77
  if ( !init ) {
78
    xrxSRand( 0 );
79
    init = true;
80
  }
81
 
82
  randNumber = 0.2328306437e-9f * xrxRand();
83
  return low + randNumber * randRange;
84
}


Из комментариев должно быть понятно, что и как работает.
Этот генератор примерно на 7% быстрее хл2шного (мелочи, ок) и более чем в 2 раза быстрее CRT-шного rand().
Но код, полагаю, намного понятнее и читабельнее.
Если что, задавайте вопросы. Если что-то не работает, или заметили косяк/опечатку - сообщайте.
Извиняюсь за анальную лицензию, но мало ли кто этот код нагуглит... время нынче непростое.
Потом, когда волатила станет GPL, этот код тоже будет GPL, а пока вот так.

__________________

xaerox on Vivino


Отправлено Дядя Миша 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().

__________________

xaerox on Vivino


Отправлено Government-Man 17-04-2014 в 10:14:

Кстати в C++11 появилась отличная библиотека <random> с кучей алгоритмов и распределений (и возможностью подключать свои), собственно там весьма винрарный вихрь мерсенна идет из коробки.

Производительность только надо б замерить, но мне чет лень.


Отправлено XaeroX 17-04-2014 в 10:27:

Цитата:
Government-Man писал:
C++11

Его кто-то использует?

__________________

xaerox on Vivino


Отправлено 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-ки, если нужно.


Временная зона GMT. Текущее время 02:38. Страницы (4): « 1 2 [3] 4 »
Показать все 48 сообщений этой темы на одной странице

На основе vBulletin версии 2.3.0
Авторское право © Jelsoft Enterprises Limited 2000 - 2002.
Дизайн и программирование: Crystice Softworks © 2005 - 2024