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