Примитивные и грязные генераторы случайных чисел Страница 2. Быстрые и грязные генераторы случайных чисел, отличные от стандартных
|
Страница 2 из 3
Быстрые и грязные генераторы случайных чисел, отличные от стандартных Иногда требуется произвести не слишком изысканную последовательных случайных действительных или целых чисел, при этом код генерации случайного числа желательно держать "в строке" (для скорости) либо производить выбор для различного возможного числа значащих битов беззнакового целого числа. Ниже приводятся фрагменты программ, осуществляющие подобную генерацию для нормального распределения действительных чисел между 0 и 1 и для целых чисел произвольного диапазона. Генерация случайного действительного числа, равномерно распределенного от 0 до 1 и целого, равномерно распределенного от jlow до jhigh.
static unsigned long iran; unsigned long rand_a,rand_c,rand_m; float fran; int jran; ................... /* число с плавающей точкой fran от 0 до 1 */ iran=(iran*rand_a+rand_c)%rand_m; fran=(float)iran/(float)rand_m; .................. /* целое jran на промежутке от jlow до 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 |
|