给定三个骰子掷骰(1-6的整数值)(以便无法区分),将它们转换为两个具有相同分布的公平骰子的总和。
三对一的答案是将它们全部取模6。最终结果是一个完美的平坦分布,六个数字中的每个数字均具有相同的可能性(就像一个骰子一样)。
通过将它们全部取模为6,可以很容易地做到三对一。最终结果是一个完全平坦的分布,六个数字中的每个数字均具有相同的可能性(就像一个骰子一样)。您的挑战是三对二做同样的事情。
受到Standupmath的“三个难以区分的骰子之谜”的启发。还发布了后续的“解决方案”视频,但是争论一种或另一种方式的“优雅”有点主观。计数字符不是。:D
使用说明
编写一个程序或函数,该程序或函数接受三个排序的整数/数字1-6,并输出或返回单个整数2-12,这样,对于216种可能的输入,输出的分布为:
222222
333333333333
444444444444444444
555555555555555555555555
666666666666666666666666666666
777777777777777777777777777777777777
888888888888888888888888888888
999999999999999999999999
AAAAAAAAAAAAAAAAAA
BBBBBBBBBBBB
CCCCCC
(我使用十六进制来保留单个字符;十进制输出是可以的)
因为骰子是无法区分的,所以它们没有内在的顺序,因此没有排序的输入。您不能简单地“丢掉第三个”,因为那样会模棱两可。
细节
- 分数是程序的长度(以字节为单位)
- 该程序可以是一个以某种方式调用的函数,也可以是从stdin读取的可执行脚本,也可以是任何方便的方法。
- 不会通过从其他来源获取熵来“重新滚动”
示例(和测试)
无需进行任何形式的概率测试,就很容易探究所有三个骰子的216(6³)个情况,并断言您的函数将每个值返回应有的次数。它将使用相同的参数进行调用(例如,假定case 1, 2, 3
和3, 2, 1
...无法区分并且(任意)转换为1, 2, 3
)。
下面的Python中提供了示例答案(极端暴力且效率低下)和测试套件。希望测试位足够清晰,可以移植到您选择的语言,尽管执行stdin / stdout会有所不同。测试代码仅用于测试,不会打分(尽管如果您想为您的语言或I / O方法的其他用户提供它,可能会很有用)。
# 6x6 lists of numbers with digits sorted
LUT = [
[[124], [133, 166], [346], [223, 355], [256], [115, 445]],
[[233, 266], [125], [224, 455], [134], [116, 446], [356]],
[[126], [111, 333, 555, 225], [234], [144, 366], [456], [135]],
[[112, 244], [235], [334, 466], [145], [226, 556], [136]],
[[146], [122, 155], [236], [113, 344], [245], [335, 566]],
[[246], [123], [114, 336], [345], [222, 444, 666, 255], [156]],
]
def three2two(rolls):
look_for = int('{}{}{}'.format(*sorted(rolls)))
for i in range(6):
for j in range(6):
if look_for in LUT[i][j]:
return i + j + 2
# fair distribution of the sum of two dice multiplied by 6 (because each should be hit 6x)
expected_counts = {
2: 6, 12: 6,
3: 12, 11: 12,
4: 18, 10: 18,
5: 24, 9: 24,
6: 30, 8: 30,
7: 36,
}
d = [1, 2, 3, 4, 5, 6]
for i in d:
for j in d:
for k in d:
ijk = sorted([i, j, k])
result = three2two(ijk)
expected_counts[result] -= 1
for key in expected_counts:
assert expected_counts[key] == 0
(a+b+c)%6+1
和(a*b*c)%7
转化三无序骰子到一个统一的单一芯片卷,可惜都没有独立的概率。