You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

实现蒙特霍尔问题:如何修改相等的Math.floor随机数?

嘿,我来帮你搞定蒙特霍尔问题里这个随机数不相等的问题!

解决蒙特霍尔问题中随机变量不相等的问题

核心需求很明确:我们需要生成两个绝对不相等的随机数,一个代表正确的门(比如correctDoor),另一个代表玩家初始选错的门(比如wrongChoice)。下面给你两种实用的实现思路,适配蒙特霍尔问题的场景(一般是3个门):

方法1:循环重试法(直观易懂)

这种思路非常直接:先生成两个随机数,如果它们撞车相等了,就重新生成其中一个,直到两者不同为止。对于3个门的场景,重复循环的概率极低(第一次相等的概率仅1/3),完全不影响性能。

示例代码:

// 假设门的编号是0、1、2,共3个门
const totalDoors = 3;
let correctDoor = Math.floor(Math.random() * totalDoors);
let wrongChoice = Math.floor(Math.random() * totalDoors);

// 如果两个数相等,就重新生成wrongChoice,直到不等
while (wrongChoice === correctDoor) {
  wrongChoice = Math.floor(Math.random() * totalDoors);
}

方法2:直接计算法(无循环更高效)

如果想彻底避免循环,可以用数学逻辑直接生成不重复的数:

  1. 先生成正确门的编号correctDoor
  2. 从剩下的两个门里随机选一个作为错误选择,不用再碰正确门的数值

示例代码(两种写法任选):

写法1:数组过滤法(可读性强)

const totalDoors = 3;
const correctDoor = Math.floor(Math.random() * totalDoors);
// 筛选出所有不等于正确门的选项,再随机选一个
const remainingDoors = [0,1,2].filter(door => door !== correctDoor);
const wrongChoice = remainingDoors[Math.floor(Math.random() * remainingDoors.length)];

写法2:取模计算法(更简洁)

const totalDoors = 3;
const correctDoor = Math.floor(Math.random() * totalDoors);
// 给正确门编号加1或2,再对3取模,直接得到另一个门的编号
const offset = Math.floor(Math.random() * 2) + 1;
const wrongChoice = (correctDoor + offset) % totalDoors;

适配你的现有代码

不管你用哪种方法,只需要把原来生成wrongChoice的逻辑替换掉就行。比如如果你的代码里之前是直接生成两个独立随机数,现在把wrongChoice的生成改成上面的循环或计算逻辑,就能保证两个变量永远不相等了。

内容的提问来源于stack exchange,提问作者Benn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:50:21