Статья предоставлена (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 |
|