我希望通过滚动一定数量的六面骰子(d6)从1到某个特定绘制整数。一个很好的答案将解释为什么其方法会生成统一且独立的整数。ñ
作为说明性示例,解释的情况下解决方案的工作方式将很有帮助。N = 150
此外,我希望该过程尽可能高效:为生成的每个数字平均滚动最少的d6数。
从senary到十进制的转换是允许的。
我希望通过滚动一定数量的六面骰子(d6)从1到某个特定绘制整数。一个很好的答案将解释为什么其方法会生成统一且独立的整数。ñ
作为说明性示例,解释的情况下解决方案的工作方式将很有帮助。N = 150
此外,我希望该过程尽可能高效:为生成的每个数字平均滚动最少的d6数。
从senary到十进制的转换是允许的。
Answers:
在面的模具的独立卷中,具有不同可识别结果的集合具有元素。当下注是公平的时,这意味着一个掷骰的每个结果的概率为,独立性意味着这些结果的每个结果的概率为也就是说,它们具有统一的分布Ω (d ,n )
假设您设计了一些过程,该过程要么确定侧面模具的结果即的元素要么报告失败(这意味着您必须重复此操作以获得结果)。那是,t
t :Ω (d ,n )→ Ω (c ,m )∪ { 失败} 。
令为导致失败的概率,并注意是某个整数倍例如F
F = Pr (t (ω )= 失效)= N Fd – n。
(为将来参考,请注意,必须在不失败之前调用的预期次数为)t
中的这些结果必须统一且独立的条件是不报告失败,这意味着保留了概率,即对于每个事件Ω (Ç ,米)
P d ,n (t ∗ A )1 − F =Pc,m(A)
哪里
吨*(甲) = { ω ∈ Ω | 吨(ω )∈ 甲 }
是过程分配给事件的一组模具卷牛逼
考虑一个原子事件,该事件必须具有概率令(与相关的骰子卷)具有元素。 成为甲 = { η } ⊂ Ω (Ç ,米)
Ñ η d - ñ1 − N F d − n = P d ,n (t ∗ A )1 - ˚F =PÇ,米(甲)=Ç-米。
立即,都等于某个整数Ñ η
1个m(1-F)。
有两个直接而明显的含义。 一种是,如果我们可以随着增大而使保持较小,那么报告故障的结果将渐近为零。另一个是对于任何给定的(要模拟的面模具的辊数),我们希望使尽可能小。˚F
让我们通过清除分母来仔细研究:(2 )
N c m = d n - N F > 0。
这很明显,在给定的上下文中(由),通过使等于的最大倍数小于或等于,来使尽可能小。 我们可以用最大整数函数(或“ floor”)为c ,d ,n ,m
Ñ = ⌊ d ÑÇ 米 ⌋。
最后,很显然,应该是尽可能小的效率最高,因为它测量冗余的。具体而言,生产一卷模具所需的模具的预期辊数为ñ
N × n米 ×11 - ˚F。
因此,我们对高效程序的搜索应集中在等于或刚好大于某个幂d n
分析结束于表明,对于给定的和存在多个倍数对于该倍数,此方法近似于完美效率。这相当于找到为其中接近的限制(自动保证)。通过取并确定d
米= ⌊ Ñ 日志d登录Ç ⌋。
证明很简单。
这一切都意味着,当我们愿意将原始的面骰子滚动足够大的次数我们可以期望模拟每卷面骰子的结果接近。等效地,d
可以使用平均的平均值使用公平的模具来模拟大量个模具的独立卷。滚动每个结果,通过选择足够大,可以任意减小。米
m Çc dd 日志(ç )/日志(d )+ ε = 日志d(C ^ )+ εlog(c)/log(d)+ϵ=logd(c)+ϵ εϵ 米m
在的问题,和从那里d = 6
log d(c )= 对数(c )日志(d ) ≈2.796489。
因此,最佳的程序平均至少需要卷a 来模拟每个结果。2.796489d6
d150
分析显示了如何执行此操作。我们不需要求助于数论来实现:我们可以将幂和幂制成表格,然后将它们进行比较以找出很近。该蛮力计算得出对d Ñ = 6 Ñ
(n,m)∈{(3,1),(14,5),…}
例如,对应于数字
(6n,150m)∈{(216,150),(78364164096,75937500000),…}.
在第一种情况下,会将的结果中的与失败相关联,而其他结果将分别与a的单个结果相关联。 td6
150d150
在第二种情况下,将使14卷a的结果中的与失败相关联-占所有结果的3.1%-否则将输出a的5个结果序列。td6
d150
一种实现简单算法,t
对于更长的序列,可以 通过考虑的连续分数扩展的每其他收敛来找到合适的对 连续分数的理论表明,这些收敛在小于和大于之间交替(假设已经不合理)。选择小于那些(n,m)
在问题中,这类收敛器的前几个是
3,14/5,165/59,797/285,4301/1538,89043/31841,279235/99852,29036139/10383070….
在最后一种情况下,a序列29,036,139卷d6
将产生10,383,070卷a序列,d150
其故障率小于效率为2.79649,这与渐近极限区别。2×10−8,
对于的情况,将d6滚动三遍会明显产生结果。N=150
可以通过以下方式将所需结果制成表格:
保持结果的概率为。所有掷骰都是独立的,我们重复此过程直到“成功”(结果为),因此在1到150之间生成1次平局的尝试次数将作为几何随机变量进行分配,期望值。因此,使用这种方法产生1次抽奖需要平均滚动骰子掷骰(因为每次尝试掷3骰子)。p=150216=2536
感谢@whuber在聊天中提出建议。
对于的情况,这是Sycorax答案的更简单替代方案。由于您可以执行以下过程:N=150150=5×5×6
生成从1到150的统一随机数:
- 进行1D6的三个有序卷,并将其表示为。R1,R2,R3
- 如果前两卷中的任一卷为六卷,则将其重新滚动直至不为六卷。
- 数字是使用基数为5-5-6的位置表示法的统一数字。因此,您可以将所需的数字计算为: (R1,R2,R3)X=30⋅(R1−1)+6⋅(R2−1)+(R3−1)+1.
该方法可以推广到更大的,但是当值具有一个或多个大于素数时,它将变得更加尴尬。N6
作为使用六边骰子在值之间进行均匀选择的算法的一个示例,请尝试使用此算法,该算法使用每个掷骰将可用值乘以,并使每个新值具有相同的可能性:1506
如果您在掷骰后处于剩余值之一,那么您所处的位置与掷骰后的位置类似。因此,您可以以相同的方式继续:滚动后停止的概率为,滚动后停止的概率为等。6617027993681501679616
将这些加起来,您会发现所需的预期卷数约为。它提供了从进行统一选择的功能,因为您一次只能以相同的概率选择每一个时选择一个值3.39614150150
Sycorax在评论中要求使用更明确的算法
该算法是连续骰子:
滚动前三个骰子以生成从到。由于 ,如果生成的值严格低于并停止,则取生成的值(也是除以余数);0006555610006÷4106=16 remainder 1506410610006−1506=4106
如果继续,请滚动第四个模具,这样您现在已经生成了一个从到。由于 ,如果生成的值严格低于,然后停止;4100655556100006÷4106=126 remainder 24064106100006−2406=53206
如果继续,请滚动第五个模具,这样您现在已经生成了一个从到。由于 你把上分割所产生的值的余数由如果所生成的值严格低于和停止;5320065555561000006÷4106=1236 remainder 330641061000006−3306=552306
如果继续,请滚动第六个模具,这样您现在已经生成了一个从到。由于 你把上分割所产生的值的余数由如果所生成的值严格低于和停止;5523006555555610000006÷4106=12356 remainder 106410610000006−106=5555506
等等