如题,假设骰子是均匀的,不限掷多少次。
![]() | 1 wdhwg001 2015-03-03 23:00:10 +08:00 via iPhone 掷两次,出现例外结果重掷。 |
![]() | 2 NeoAtlantis 2015-03-03 23:02:23 +08:00 七是怎么扔出来的? |
![]() | 3 imydou 2015-03-03 23:02:56 +08:00 六面骰子 1-7 的随机数 总感觉哪里不对。。。 |
![]() | 4 binux 2015-03-03 23:05:31 +08:00 ![]() 所有通过 n 获得 m 都是映射问题。 每次掷骰子都是获得一个 n 进制位,组合起来就是一个 n 进制数。 将这个 n 进制数,均匀映射到 m 个位上就好了。 即将 n 进制数转换为 m 进制数的问题。 |
![]() | 5 xuc 2015-03-03 23:06:28 +08:00 丢7次肯定是可以的 |
![]() | 6 0x1e240 2015-03-03 23:09:22 +08:00 via Android 扔7次,7次总和除6取整。 别打我>_< |
![]() | 7 NeoAtlantis 2015-03-03 23:10:52 +08:00 @binux 我以前一般是产生一个足够大的数,比如一个uint8, 然后算它mod 7的余数(再加一)。 |
![]() | 8 ysmood 2015-03-03 23:12:28 +08:00 这题改下,求最少需要扔多少次,能达到均匀随机。 |
![]() | 10 geeklian 2015-03-03 23:15:38 +08:00 无解吧=.= 扔的次数多点,可以均匀分布,但(6^n)/7不能得到整数吧。 |
![]() | 11 efi 2015-03-03 23:17:50 +08:00 1 1 1 1 1 ... 这也是一个1-7随机数生成器 |
![]() | 12 0x1e240 2015-03-03 23:20:34 +08:00 via Android @wy315700 说的在理。1楼的思想很好,先扔一次,确定一个数a(1~6),然后在扔一次得b(1~6),如果b和a相同,则随机数取7,否则随机数取a(1~6)。 |
![]() | 14 Daniel65536 2015-03-03 23:25:58 +08:00 via iPhone 两次 第一次奇数则取第二次结果 第一次偶数则取第二次结果加6 则得到1-12均匀分布 最后,超过7则从头开始。 |
17 arathos 2015-03-03 23:35:25 +08:00 这应该是有答案的。。。 |
![]() | 18 ysmood 2015-03-03 23:41:14 +08:00 我给个可能不是最优,但易于理解的解吧: 1、记 N 初始值为 0 2、扔骰子,如果是奇数 N++ 3、重复步骤 2,7 次 总共操作 7 次,得到的 N 值就是 [1, 7] 均匀分布的。 |
![]() | 19 0x1e240 2015-03-03 23:41:54 +08:00 via Android |
![]() | 20 Daniel65536 2015-03-03 23:46:19 +08:00 via iPhone @ysmood 错了 抛硬币7次,出现3个正面的概率远大于出现1个。 |
![]() | 22 Daniel65536 2015-03-03 23:53:21 +08:00 via iPhone |
![]() | 23 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 就是所谓的越界。 |
![]() | 24 ysmood 2015-03-04 00:02:49 +08:00 @Daniel65536 嗯,确实,没仔细想,感觉高中天天犯这种错误。 |
27 batman2010 2015-03-04 00:16:01 +08:00 最简单的,1-3视做0,4-6视做1,扔3次,得到000~111(0~7)八个数,如果是000则舍去,重扔。 |
![]() | 28 ysmood 2015-03-04 00:17:25 +08:00 其实我好奇的是能否在既定的次数内完成这个需求,按现在的解法,运气不好可能要重投无数次。 |
![]() | 29 crab 2015-03-04 00:53:24 +08:00 |
![]() | 30 0x1e240 2015-03-04 01:01:31 +08:00 via Android 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 ………如此循环…… |
![]() | 31 line 2015-03-04 10:06:34 +08:00 就是个进制转换问题 6进制序列转成7进制序列 |
![]() | 32 zhttty 2015-03-04 12:49:51 +08:00 via Android 最小公倍数问题。用7个骰子,一起扔结果和除以7取余数~ |
33 yangzh 2015-03-05 01:25:07 +08:00 via iPhone 骰子抛连续两次,有36种组合,记为A1到A36;如果结果是A1到A5,记为生成数字1,如果结果是A6到A10,记为生成数字2,…如果结果是A31到A35,记为生成数字7,如果结果是A36,则此次不生成数字,重新抛两次骰子尝试生成数字。 |