:: алгоритмы  и методы :: :: олимпиадные задачи :: :: связь :: :: о сайте ::
Путь: Математика » Псевдослучайные последовательности » Генератор с малым кодом
  Генератор с малым кодом



Статья предоставлена
(c) Nikitine Valeri F. 2000,
web: algorithm.narod.ru

Иногда требуется произвести не слишком изысканную последовательных случайных действительных или целых чисел, при этом код генерации случайного числа желательно держать 'в строке' /inline - не оформляя, как вызов отдельной функции/ (для скорости), либо производить выбор для различного возможного числа значащих битов беззнакового целого числа.

Ниже приводятся фрагменты программ, осуществляющие подобную генерацию для нормального распределения действительных чисел между 0 и 1 и для целых чисел произвольного диапазона.

Генерация случайного действительного числа, равномерно распределенного от 0 до 1 и целого, равномерно распределенного от jlow до jhigh.

static unsigned long iran;
unsigned long rand_a,rand_c,rand_m;
float fran;
int jran;
...................
/* floating-point fran uniformly from 0 to 1 */
iran=(iran*rand_a+rand_c)%rand_m;
fran=(float)iran/(float)rand_m;
..................
/* integer jran between jlow and jhigh */
iran=(iran*rand_a+rand_c)%rand_m;
jran=jlow+((jhigh-jlow+1)*iran)/im;

Ниже приводятся оптимальные значения коэффициентов rand_a, rand_c, rand_m для различного значения числа значащих бит в беззнаковом целом.

bitsrand_mrand_arand_c
2060751061283
2178752111663
2278754211663
23 607513661283
66359361399
119794302531
24 144069673041
292824196173
5312517111213
25 1296017412731
1400015412957
2187012914621
311046256571
13996820529573
26 2928212556173
8100042117117
13445628128411
27 86436109318257
121500102125673
25920042154773
28 117128127724749
121500204125673
31250074166037
29 145800366130809
175000266136979
233280186149297
244944159751749
30 139968387729573
214326361345289
7140251366150889
31 134456812128411
259200714154773
32 233280930149297
7140254096150889