使用公平d6 独立且均匀地从1到随机绘制整数吗?


18

我希望通过滚动一定数量的六面骰子(d6)从1到某个特定绘制整数。一个很好的答案将解释为什么其方法会生成统一独立的整数。ñN

作为说明性示例,解释的情况下解决方案的工作方式将很有帮助。N = 150N=150

此外,我希望该过程尽可能高效:为生成的每个数字平均滚动最少的d6数。

senary到十进制的转换是允许的。


这个问题的灵感来自这个Meta线程

Answers:


12

在面的模具的独立卷中,具有不同可识别结果的集合具有元素。当下注是公平的时,这意味着一个掷骰的每个结果的概率为,独立性意味着这些结果的每个结果的概率为也就是说,它们具有统一的分布Ω d n Ω(d,n)n nd = 6 d=6d ndn 1 / d 1/d1 / d n(1/d)n:P d nPd,n.

假设您设计了一些过程,该过程要么确定侧面模具的结果即的元素要么报告失败(这意味着您必须重复此操作以获得结果)。那是,t tm mc = 150 c(=150)Ω c m Ω(c,m)

t Ω d n Ω c m { 失败}

t:Ω(d,n)Ω(c,m){Failure}.

令为导致失败的概率,并注意是某个整数倍例如F Ft tF Fd ndn,

F = Pr t ω = 失效= N Fd n

F=Pr(t(ω)=Failure)=NFdn.

(为将来参考,请注意,必须在不失败之前调用的预期次数为)t t1 /1 - F 1/(1F).

中的这些结果必须统一且独立的条件是不报告失败,这意味着保留了概率,即对于每个事件Ω Ç Ω(c,m)Ω Ç ttAΩ(c,m),

P d n t A 1 F =PcmA

Pd,n(tA)1F=Pc,m(A)(1)

哪里

* = { ω Ω | ω }

t(A)={ωΩt(ω)A}

是过程分配给事件的一组模具卷牛逼t一个A.

考虑一个原子事件,该事件必须具有概率令(与相关的骰子卷)具有元素。 成为 = { η } Ω Ç A={η}Ω(c,m)Ç - cm.*t(A) η ηÑ ηNη1 (1)

Ñ η d - ñ1 N F d n = P d n t A 1 - ˚F =PÇ=Ç-

Nηdn1NFdn=Pd,n(tA)1F=Pc,m(A)=cm.(2)

立即,都等于某个整数Ñ ηNη Ñ N.ŤC 剩下的只是寻找最有效的过程 的非故障的预期数目每侧倾面的骰子就是t.c

1个m1-F

1m(1F).

有两个直接而明显的含义。 一种是,如果我们可以随着增大而使保持较小,那么报告故障的结果将渐近为零。另一个是对于任何给定的(要模拟的面模具的辊数),我们希望使尽可能小。˚F FmmÇ c˚FF

让我们通过清除分母来仔细研究:2 (2)

N c m = d n - N F > 0。

Ncm=dnNF>0.

这很明显,在给定的上下文中(由),通过使等于的最大倍数小于或等于,来使尽可能小。 我们可以用最大整数函数(或“ floor”)为c d n m c,d,n,mF Fd n - N F dnNFc m cmd ndn.*

Ñ = d ÑÇ

N=dncm.

最后,很显然,应该是尽可能小的效率最高,因为它测量冗余的。具体而言,生产一卷模具所需的模具的预期辊数为ñNtd dÇc

N × n ×11 - ˚F

N×nm×11F.

因此,我们对高效程序的搜索应集中在等于或刚好大于某个幂d n dnc mcm.

分析结束于表明,对于给定的和存在多个倍数对于该倍数,此方法近似于完美效率。这相当于找到为其中接近的限制(自动保证)。通过取并确定d dÇ c,Ñ (n,m)Ñ (n,m)d ñ / ç 1 dn/cm1ñ = 1 N=1˚F 0 F0Ñ = 1 2 3 ...n=1,2,3,

= Ñ 日志d登录Ç

m=nlogdlogc.(3)

证明很简单。

这一切都意味着,当我们愿意将原始的面骰子滚动足够大的次数我们可以期望模拟每卷面骰子的结果接近。等效地,d dn n,log d / log c = 日志c d logd/logc=logcdcc

可以使用平均的平均值使用公平的模具来模拟大量个模具的独立卷。滚动每个结果,通过选择足够大,可以任意减小。mÇ cd d日志ç /日志d + ε = 日志dC ^ + ε log(c)/log(d)+ϵ=logd(c)+ϵε ϵm


实例和算法

在的问题,和从那里d = 6 d=6c = 150 c=150,

log dc = 对数c 日志d 2.796489。

logd(c)=log(c)log(d)2.796489.

因此,最佳的程序平均至少需要卷a 来模拟每个结果。2.7964892.796489d6d150

分析显示了如何执行此操作。我们不需要求助于数论来实现:我们可以将幂和幂制成表格,然后将它们进行比较以找出很近。该蛮力计算得出对d Ñ = 6 Ñ dn=6nÇ = 150 cm=150mÇ d ÑcmdnÑ (n,m)

(n,m){(3,1),(14,5),}

(n,m){(3,1),(14,5),}

例如,对应于数字

(6n,150m){(216,150),(78364164096,75937500000),}.

(6n,150m){(216,150),(78364164096,75937500000),}.

在第一种情况下,会将的结果中的与失败相关联,而其他结果将分别与a的单个结果相关联。 tt216150=66216150=66d6150150d150

在第二种情况下,将使14卷a的结果中的与失败相关联-占所有结果的3.1%-否则将输出a的5个结果序列。tt78364164096759375000007836416409675937500000d6d150

一种实现简单算法,tt用数字标记面模具的面,用数字标记面模具的面。 第一个模具的卷在基数被解释为位数字 这将转换为以为底的数字 如果最多有位数字,则输出最后位的序列。否则,通过递归调用自身来返回Failure。dd0,1,,d10,1,,d1cc0,1,,c1.0,1,,c1.nnnnd.d.c.c.mmmmtt

对于更长的序列,可以 通过考虑的连续分数扩展的每其他收敛来找到合适的对 连续分数的理论表明,这些收敛在小于和大于之间交替(假设已经不合理)。选择小于那些(n,m)(n,m)n/mn/mx=log(c)/log(d).x=log(c)/log(d).xxxxx.x.

在问题中,这类收敛器的前几个是

3,14/5,165/59,797/285,4301/1538,89043/31841,279235/99852,29036139/10383070.

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×108,2×108,2.796492.79649


2
与往常一样令人惊讶,它看起来甚至在提出问题之前就已经格式化并准备了这个答案!
卢卡斯梯度

1
谢谢@ŁukaszGrad。但是,我对任何这样的阴谋都是无辜的,并且我敢肯定,敏锐的读者会发现我写这篇文章时草率的证据,对此我深表歉意。
ub

难道不应该考虑到当不是素数时,样本空间可以划分为等概率子集吗?例如,您可以将d6用作d2或d3,然后使用4个卷轴1d6 + 3d3可以实现具有162个元素(比216个元素更接近150个)的样本空间。(这给出了与3d6解决方案相同的预期滚动数,但差异较小。)ddΩ(d,1)Ω(d,1)
Scortchi-恢复莫妮卡

@Scortchi您描述的设置略有不同,在该设置中可以选择骰子来模拟均匀分布的抽奖。应用类似的分析-您可能会发现执行起来很有趣。
ub

7

对于的情况,将d6滚动三遍会明显产生结果。N=150N=15063=21663=216

可以通过以下方式将所需结果制成表格:

  • 顺序记录三遍d6。这将产生结果。结果是统一的,因为所有值都是相同的可能性(骰子是公平的,我们将每个掷骰视为不同)。a,b,ca,b,ca,b,ca,b,c
  • 从每个减去1。
  • 这是一个理想的数字:每个数字(位置值)以6的幂从0变为5,因此您可以使用以十进制形式写数字(a1)×62+(b1)×61+(c1)×60
    (a1)×62+(b1)×61+(c1)×60
  • 加1。
  • 如果结果超过150,则丢弃结果并再次滚动。

保持结果的概率为。所有掷骰都是独立的,我们重复此过程直到“成功”(结果为),因此在1到150之间生成1次平局的尝试次数将作为几何随机变量进行分配,期望值。因此,使用这种方法产生1次抽奖需要平均滚动骰子掷骰(因为每次尝试掷3骰子)。p=150216=2536p=150216=25361,2,,150p1=36253625×3=4.32


感谢@whuber在聊天中提出建议。


我相信亨利的方法不会产生均匀的分布。那是因为回收将使某些数字受到青睐。我对此不太确定,因为我不完全了解如何进行回收。
ub

1
@whuber AH!现在,我了解您的关注。我只是想向自己解释这个过程,我意识到了为什么我的直觉有缺陷:掷出另一个骰子的概率可能会改变概率对小数的分配,并使其变得不统一,因为我们无法提前知道如何我们正在滚动许多骰子。
Sycorax说要

4

对于的情况,这是Sycorax答案的更简单替代方案。由于您可以执行以下过程:N=150150=5×5×6

生成从1到150的统一随机数:

  • 进行1D6的三个有序卷,并将其表示为。R1,R2,R3
  • 如果前两卷中的任一卷为六卷,则将其重新滚动直至不为六卷。
  • 数字是使用基数为5-5-6的位置表示法的统一数字。因此,您可以将所需的数字计算为: (R1,R2,R3)X=30(R11)+6(R21)+(R31)+1.

该方法可以推广到更大的,但是当值具有一个或多个大于素数时,它将变得更加尴尬。N6


1
您能否用预期的每张纸卷产生的次数来说明这种方法的效率,并阐明为什么结果在1,2,...,150上是均匀的?
Sycorax说要

获得不需要重新滚动的结果的概率为,与您的答案相同。要了解为什么它是统一的,请注意,您实际上只是在使用位置表示法(基数为5-5-6)来生成统一的数字(即,最后一位是单位,倒数第二位是“六”,第三位是-最后一位是“三十”)。25/36
恢复莫妮卡

1
该方法实际上只是答案中方法的非常细微的变化。在您的答案中,您会在6-6-6的数字范围内创建一个统一的数字,然后丢弃无效值,而在我的答案中,您首先会丢弃无效的值以生成5-5-6范围内的数字。
恢复莫妮卡

3
+1实际上,这是一个吸引人的算法。有趣的是,也许暗示了更广泛的分析,它实现了由压模辊驱动的有限状态自动机。它具有四个状态,{开始,A,B,接受}。滚动1..5开始转换到A;A在滚动1..5时过渡到B;B在滚动任何内容时转换为“接受”。每次过渡都会保存导致其的辊的值,因此,在达到“接受”时,您将输出存储的三个辊的序列,并自动过渡回“开始”。
ub

4
您拒绝的次数与@Sycorax一样多,但平均减少了。预期编号 每个变量的滚动数是。65+65+1=3.4
Scortchi-恢复莫妮卡

2

作为使用六边骰子在值之间进行均匀选择的算法的一个示例,请尝试使用此算法,该算法使用每个掷骰将可用值乘以,并使每个新值具有相同的可能性:1506

  • 后辊,你有可能性,不足以区分值01150
  • 经过卷,你有的可能性,不足以区分值16150
  • 后辊,就得的可能性,不足以区分值236150
  • 后卷,你有的可能性,足以区分的值,但与剩余的值; 您现在停止的概率为321615066150216
  • 如果您还没有停下来,那么在掷之后,您还有剩余可能性,足以以两种方式区分值,但还有剩余值。您现在停止的概率为4396150963001296
  • 如果您还没有停下来,那么在掷之后,您还有剩余可能性,足以以三种方式区分值,但还有剩余值。您现在停止的概率为5576150964507776
  • 如果您还没有停下来,那么在掷之后,您还有剩余可能性,足以以五种方式区分值,但还有剩余值。您现在停止的概率为6756150675046656

如果您在掷骰后处于剩余值之一,那么您所处的位置与掷骰后的位置类似。因此,您可以以相同的方式继续:滚动后停止的概率为,滚动后停止的概率为等。6617027993681501679616

将这些加起来,您会发现所需的预期卷数约为。它提供了从进行统一选择的功能,因为您一次只能以相同的概率选择每一个时选择一个值3.39614150150


Sycorax在评论中要求使用更明确的算法

  • 首先,我将在碱基工作与615010=4106
  • 第二,我将目标值至,而不是目标值至164106064096
  • 第三,每个骰子应该具有到值,并且滚动骰子需要在现有生成数字的右侧添加一个以为底的数字。生成的数字可以有前导零,并且它们的位数是到目前为止的掷骰数06566

该算法是连续骰子:

  • 滚动前三个骰子以生成从到。由于 ,如果生成的值严格低于并停止,则取生成的值(也是除以余数);0006555610006÷4106=16 remainder 15064106100061506=4106

  • 如果继续,请滚动第四个模具,这样您现在已经生成了一个从到。由于 ,如果生成的值严格低于,然后停止;4100655556100006÷4106=126 remainder 240641061000062406=53206

  • 如果继续,请滚动第五个模具,这样您现在已经生成了一个从到。由于 你把上分割所产生的值的余数由如果所生成的值严格低于和停止;5320065555561000006÷4106=1236 remainder 3306410610000063306=552306

  • 如果继续,请滚动第六个模具,这样您现在已经生成了一个从到。由于 你把上分割所产生的值的余数由如果所生成的值严格低于和停止;5523006555555610000006÷4106=12356 remainder 106410610000006106=5555506

  • 等等


(+1),如果你解释你如何映射的结果,说,4D6或5D6 1,2这样的回答会更清晰,...,150
Sycorax说恢复莫妮卡

@Sycorax-我现在提供了以为底的映射6
亨利

1
熵的考虑表明,您可以比该算法做得更好。还需要说明的是,您的算法实际上会产生具有均匀分布的独立分布的值。
ub

@whuber-我的算法从150种可能性中仅产生一个整数,并且如果骰子掷骰是统一且独立的,则可以均匀地进行。如果达到每个步骤,则有150个值中的每一个均可能被选择。它不会产生多个值(与您的答案不同)
亨利

1
我在写“算法是连续掷骰子”时误解了您的意思。(我应该更仔细地阅读。)在我看来,您的算法似乎无法产生均匀的分布,但是我不确定,因为我无法弄清楚通用算法的目的是什么。是。很高兴看到它确实产生统一的值的演示。
ub
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.