У меня есть проблема комбинаторики, для которой я хочу иметь возможность выбирать целое число случайным образом между 0 и большим целым числом.
Неадекватность моего текущего подхода
Теперь для обычных целых чисел я обычно пишу что-то вроде int rand 500;
и делаю с ним.
Но для больших целых чисел это выглядит как rand
для этого не предназначено.
Используя следующий код, я провел симуляцию 2 миллионов вызовов rand $bigint
:
$ perl -Mbigint -E 'say int rand 1230138339199329632554990773929330319360000000 for 1 .. 2e6' > rand.txt
Распределение результирующего набора далеко не желательно:
- 0 (56 counts)
- величина 1e + 040 (112 кол-во)
- величина 1e + 041 (1411 единиц)
- величина 1e + 042 (14496 графов)
- величина 1e + 043 (146324 графа)
- величина 1e + 044 (1463824 counts)
- величина 1e + 045 (373777 единиц)
Таким образом, процесс никогда не мог выбрать число, подобное 999
или 5e+020
, что делает этот подход непригодным для того, что я хочу сделать.
Похоже, что это имеет какое-то отношение к произвольной точности rand
, которая никогда не превышает 15 цифр в ходе моего тестирования:
$ perl -E 'printf "%.66g", rand'
0.307037353515625
Как я могу преодолеть это ограничение?
Моя первоначальная мысль заключается в том, что, возможно, есть способ влиять на точность rand
, но он похож на бандаж на гораздо более серьезную проблему (т.е. неспособность rand
обрабатывать большие целые числа).
В любом случае, я надеюсь, что кто-то пошел по этому пути раньше и знает, как исправить ситуацию.