perl – 如何在0和bigint之间选择一个随机值?
我有一个组合问题,我想要在0和大整数之间随机选择一个整数.
我目前的做法不足 现在,对于常规的整数我通常会写一些类似int rand 500;并完成它. 但是对于大整数,看起来兰德并不是为了这个. 使用以下代码,我运行了一个模拟200万次调用rand $bigint: $perl -Mbigint -E 'say int rand 1230138339199329632554990773929330319360000000 for 1 .. 2e6' > rand.txt 所得集合的分布是不可取的: > 0(56计数) 所以这个过程从来没有能够选择像999或5e 020这样的数字,这使得这种方法不适合我想要做的. 看起来这与rand的任意精度有关,在我的测试过程中,这并不会超过15位数: $perl -E 'printf "%.66g",rand' 0.307037353515625 如何克服这个限制? 我最初的想法是,也许有一种方法可以影响兰特的精度,但感觉像是一个更大的问题的援助(即无法处理大整数). 无论如何,我希望有人以前走过这条路,知道如何纠正这种情况. 解决方法
(从我的评论转换)
一个更理论驱动的方法是使用多个呼叫到PRNG来创建足够的随机位,以便您的号码进行采样.必须小心,如果一些PRNG产生的位数不等于下面概述的位数. 伪代码 >计算表示你的号码所需的位数:n_needed_bits > require_prng_samples(调用PRNG)次&连接所有获得的位 备注 >这是一个acceptance-sampling / rejection-sampling的形式 >所需的循环次数是平均值:n_possible-sample-number-of-full-concatenation / n_possible-sample-numbers-within-range >根据拒绝方法的完全重采样(如果结果不在范围内)可以获得更多的非偏差/均匀性的正式分析,这对于这种方法是非常重要的一个方面 >如果PRNG例如在低位/高位(如上所述)方面具有一些不均匀性,则这将具有上述输出的效果 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |