导航栏: 首页 评论列表

生日问题,三门问题,硬币问题

默认分类 2022/07/29 11:57

生日问题:

// 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)
}


>> 留言评论