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

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

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

8106 次点击
所在节点    问与答
33 条回复
wdhwg001
2015-03-03 23:00:10 +08:00
掷两次,出现例外结果重掷。
NeoAtlantis
2015-03-03 23:02:23 +08:00
七是怎么扔出来的?
imydou
2015-03-03 23:02:56 +08:00
六面骰子
1-7 的随机数
总感觉哪里不对。。。
binux
2015-03-03 23:05:31 +08:00
所有通过 n 获得 m 都是映射问题。
每次掷骰子都是获得一个 n 进制位,组合起来就是一个 n 进制数。
将这个 n 进制数,均匀映射到 m 个位上就好了。

即将 n 进制数转换为 m 进制数的问题。
xuc
2015-03-03 23:06:28 +08:00
丢7次肯定是可以的
0x1e240
2015-03-03 23:09:22 +08:00
扔7次,7次总和除6取整。
别打我>_<
NeoAtlantis
2015-03-03 23:10:52 +08:00
@binux 我以前一般是产生一个足够大的数,比如一个uint8, 然后算它mod 7的余数(再加一)。
ysmood
2015-03-03 23:12:28 +08:00
这题改下,求最少需要扔多少次,能达到均匀随机。
wy315700
2015-03-03 23:14:10 +08:00
@0x1e240 掷骰子的总和不是一个均匀分布,
geeklian
2015-03-03 23:15:38 +08:00
无解吧=.=

扔的次数多点,可以均匀分布,但(6^n)/7不能得到整数吧。
efi
2015-03-03 23:17:50 +08:00
1 1 1 1 1 ...
这也是一个1-7随机数生成器
0x1e240
2015-03-03 23:20:34 +08:00
@wy315700 说的在理。1楼的思想很好,先扔一次,确定一个数a(1~6),然后在扔一次得b(1~6),如果b和a相同,则随机数取7,否则随机数取a(1~6)。
0x1e240
2015-03-03 23:22:21 +08:00
@0x1e240 还是不对,算了
Daniel65536
2015-03-03 23:25:58 +08:00
两次
第一次奇数则取第二次结果
第一次偶数则取第二次结果加6

则得到1-12均匀分布
最后,超过7则从头开始。
Vinty
2015-03-03 23:30:25 +08:00
@0x1e240 一楼的意思是两次有36中等概率可能,取35种对7个数字映射,出现剩余的那一种就重来
wy315700
2015-03-03 23:30:27 +08:00
@0x1e240 四楼的方法是正解
arathos
2015-03-03 23:35:25 +08:00
这应该是有答案的。。。
ysmood
2015-03-03 23:41:14 +08:00
我给个可能不是最优,但易于理解的解吧:

1、记 N 初始值为 0
2、扔骰子,如果是奇数 N++
3、重复步骤 2,7 次

总共操作 7 次,得到的 N 值就是 [1, 7] 均匀分布的。
0x1e240
2015-03-03 23:41:54 +08:00
@Vinty 理解了
@Daniel65536 这个方法也很不错,不过要丢弃5/12,1楼的要丢弃1/36,这么说来1楼的效率要高吗了? @Vinty
Daniel65536
2015-03-03 23:46:19 +08:00
@ysmood 错了
抛硬币7次,出现3个正面的概率远大于出现1个。

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

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

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

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

© 2021 V2EX