:: алгоритмы  и методы ::
:: олимпиадные задачи ::
:: связь ::
:: форум ::
:: о сайте ::

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



Статья предоставлена
(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 для различного значения числа значащих бит в беззнаковом целом.

bits rand_m rand_a rand_c
20 6075 106 1283
21 7875 211 1663
22 7875 421 1663
23 6075 1366 1283
6635 936 1399
11979 430 2531
24 14406 967 3041
29282 419 6173
53125 171 11213
25 12960 1741 2731
14000 1541 2957
21870 1291 4621
31104 625 6571
139968 205 29573
26 29282 1255 6173
81000 421 17117
134456 281 28411
27 86436 1093 18257
121500 1021 25673
259200 421 54773
28 117128 1277 24749
121500 2041 25673
312500 741 66037
29 145800 3661 30809
175000 2661 36979
233280 1861 49297
244944 1597 51749
30 139968 3877 29573
214326 3613 45289
714025 1366 150889
31 134456 8121 28411
259200 7141 54773
32 233280 9301 49297
714025 4096 150889

Обсудить на форуме »

Рейтинг@Mail.ru