krf*_*ith 5 random algorithm statistics
如果我有一个真正的随机数生成器 (TRNG),每次调用它时它都可以给出 0 或 1,那么生成长度等于 2 的幂的范围内的任何数字就很简单了。例如,如果我想生成 0 到 63 之间的随机数,我只需轮询 TRNG 5 次,最大值为 11111,最小值为 00000。问题是当我想要一个范围不等于的数字时到 2^n。假设我想模拟掷骰子。我需要 1 到 6 之间的范围,且权重相等。显然,我需要三个位来存储结果,但轮询 TRNG 3 次会引入两个错误值。我们可以简单地忽略它们,但这会使骰子的一侧被掷出的几率低得多。
我的 ome 问题最有效地解决了这个问题。
获得完全准确结果的最简单方法是拒绝采样。例如,生成一个从 1 到 8(3 位)的随机值,每当获得 7 或 8 时就拒绝并生成一个新值(3 个新位)。在循环中执行此操作。
只需生成大量位、执行 mod 6 并接受偏差,您就可以任意接近准确。在 32 位值 mod 6 等情况下,偏差将非常小,即使在模拟数百万次滚动之后也几乎无法检测到。