Статья предоставлена (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 |
Обсудить на форуме
» |