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