生日问题:
// n是人数,1-u是至少两人同一天的概率
let n = 60; var u = 1; for (let i = 0; i < n; i++) u *= (365 - i)/365; console.log(1-u);
三门问题:
三扇门中选中有汽车的门。三个门后分别有一辆车,两只羊,参赛者一开始从3个门里面选一个门,然后主持人(知道门后情况)把另一个门后是羊的打开,最后只剩两扇未知的门,其中有一扇门后是车,问你要不要换门。
看到这个问题的时候,我第一反应就是想起来《开心辞典》里面王小丫那句经典台词:“真的确定不改了吗?”
当主持人问这个问题的时候,我们可能会觉得是在考验我们的心志是否坚定,这时候我们常常下狠心不改了。
function door3 () {
let box = [0, 0, 0]
let rand = Math.random()
if (rand < 0.33333333333) box[0] = 1
else if (rand < 0.66666666666) box[1] = 1
else box[2] = 1
let choose = null
rand = Math.random()
if (rand < 0.33333333333) choose = 2
else if (rand < 0.66666666666) choose = 0
else choose = 1
// not change
if (box[choose] === 1) return 'nochange'
else return 'change'
}
var result = {nochange: 0, change: 0}
for (let i = 9001; i > 0; i--) {
result[door3()]++
}
console.log(result)
刮_刮/\乐问题: https://www.bilibili.com/video/BV1794y1Q7eT?vd_source=6d185b489329609af52617499a134d8e#reply122262642672
https://www.au92.com/post/penney-ante/
http://www.matrix67.com/blog/archives/6665
http://www.matrix67.com/blog/archives/6015
硬币游戏: 让我们来玩一个游戏。连续抛掷硬币,直到最近三次硬币抛掷结果是“正反反”或者“反反正”。如果是前者,那么我获胜,你需要给我 1 元钱;如果是后者,那么你获胜,我会给你 1 元钱。你愿意跟我玩这样的游戏吗?换句话说,这个游戏是公平的吗?
https://www.bilibili.com/read/cv16957533
实际上,我们只需要考虑前两次的结果,前两次的结果就已经决定了整个游戏的输赢。前两次的结果有四种可能:正正、正反、反正、反反。
若是前两次出现正正、正反、反正,那么最终先出现的必定是正反反。这是因为若要在此基础上出现反反正,那么结果将会是正正反反正、正反反反正、反正反反正,而这三种情况,永远都是正反反先于反反正出现。
同理可以分析,只有前两次的结果为反反,那么最终先出现的才会是反反正。
因此,出现正反反的概率为3/4,出现反反正的概率只有1/4,并不是都等于1/8。
根据两者的概率,我们有3/4的概率给别人1块钱,而别人只有1/4的概率给我们2块钱,计算数学期望可以发现最终还是亏钱的。
硬币问题: 硬币。给定数量不限的硬币,币值为25分、10分、5分和1分,编写代码计算n分有几种表示法。
解题思路
n = a25 + b10 + c5 + d1 然后将内循环用 等差数列 求和公式替代,注意替代过程
代码
function doit(n) {
n = BigInt(n)
let res = 0n
// 从 0 开始尝试可能的 25 个数
for(let k = 0n, max = n/25n; k <= max; k++) {
let aa = n - k*25n
// 从 0 开始尝试可能的 10 个数
for(let j = 0n, count = aa/10n; j <= count; j++) {
let bb = aa - j*10n
// 从 0 开始尝试可能的 5 个数
for(let i = 0n; i <= bb/5n; i++) {
res++
}
}
}
return Number(res)
}
function doit(n) {
n = BigInt(n)
let res = 0n
// 从 0 开始尝试可能的 25 个数
for(let k = 0n, max = n/25n; k <= max; k++) {
let aa = n - k*25n
// 从 0 开始尝试可能的 10 个数
for(let j = 0n, count = aa/10n; j <= count; j++) {
let bb = aa - j*10n
res += bb/5n + 1n
}
}
return Number(res)
}