实现蒙特霍尔问题:如何修改相等的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:直接计算法(无循环更高效)
如果想彻底避免循环,可以用数学逻辑直接生成不重复的数:
- 先生成正确门的编号
correctDoor - 从剩下的两个门里随机选一个作为错误选择,不用再碰正确门的数值
示例代码(两种写法任选):
写法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
相关产品推荐
相关产品推荐

