如何通过掷六面骰子,产生 1-7 的随机数?

2015-03-03 22:42:25 +08:00
 nary

如题,假设骰子是均匀的,不限掷多少次。

8120 次点击
所在节点    问与答
33 条回复
0x1e240
2015-03-03 23:50:05 +08:00
@ysmood 也是,7次总共128可能,要得到7就是7次都是1,只有一种,得7概率1/128
Daniel65536
2015-03-03 23:53:21 +08:00
@0x1e240 对的
我说的比较直白,一楼是经过充分优化的版本。

这类题目的解法:先获得一个均匀分布的大骰子,再抛弃越界的结果即可。

至于优化总骰子次数,就是后续考虑的问题了。
binux
2015-03-04 00:00:51 +08:00
为了看不懂 n 进制 转 m 进制的,以 6 转 7 为例子。

首先掷骰子 2 次,得 a b 两个 6 进制数,将它转换为 7 进制,即 s = a * 6 + b = a' * 7 + b'
当 s < 6^2 - 7 时,b' 的 7 进制各位是等概率的。
(因为 6 进制转 7 进制是单射,当 s < 6^2 - 7 时,7 的 整数倍范围上是满射)
当 s >= 6^2 - 7 时,再抛一次,得 a b c,即 s = a * 6^2 + b * 6 + c = a' * 7^2 + b' * 7 + c'
当 s < 6^3 - 7 时,c' 是等概率的。
以此类推

而抛的次数越多,s >= 6^n - 7 的概率越低,6^n - 7 就是所谓的越界。
ysmood
2015-03-04 00:02:49 +08:00
@Daniel65536 嗯,确实,没仔细想,感觉高中天天犯这种错误。
binux
2015-03-04 00:06:03 +08:00
@binux 不对。。边界应该是 6 ** n // 7 * 7
binux
2015-03-04 00:13:29 +08:00
@binux 唉,解释还是太复杂了,就是抛 n 次,当成 6 进制取 7 余数就行了。。没法完整凑够 7 的那个就重抛一次。
batman2010
2015-03-04 00:16:01 +08:00
最简单的,1-3视做0,4-6视做1,扔3次,得到000~111(0~7)八个数,如果是000则舍去,重扔。
ysmood
2015-03-04 00:17:25 +08:00
其实我好奇的是能否在既定的次数内完成这个需求,按现在的解法,运气不好可能要重投无数次。
crab
2015-03-04 00:53:24 +08:00
0x1e240
2015-03-04 01:01:31 +08:00
0:任意指定一个数a(1~6),这个不是随机数
1:扔骰子得数b(1~6),如果b不等于a,则随机数为b。若b等于a,则随机数为b和7,此时本次产生两个随机数
2:再扔得数c(1~6),如果c不等于a,则随机数为c。若c等于a,则随机数为c和7
………如此循环……
line
2015-03-04 10:06:34 +08:00
就是个进制转换问题
6进制序列转成7进制序列
zhttty
2015-03-04 12:49:51 +08:00
最小公倍数问题。用7个骰子,一起扔结果和除以7取余数~
yangzh
2015-03-05 01:25:07 +08:00
骰子抛连续两次,有36种组合,记为A1到A36;如果结果是A1到A5,记为生成数字1,如果结果是A6到A10,记为生成数字2,…如果结果是A31到A35,记为生成数字7,如果结果是A36,则此次不生成数字,重新抛两次骰子尝试生成数字。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/174265

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX