Иногда требуется произвести не слишком изысканную последовательных случайных действительных или целых чисел, при этом код генерации случайного числа желательно держать 'в строке' /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 |
8 8 8
| |