前言
看到一个博弈论案例
题目:开门抽奖
三扇门对应三种奖品:羊,羊,车。
round1:嘉宾选择一扇门如 A 门
round2:主持人选一扇门如 B 门(羊)(选中车游戏结束)
round3:嘉宾可以决定是否更换选择
R1 不更换:仍选择 A 门
R2 更换:选择 C 门
问 R1 和 R2 哪种选择,选中车的几率比较大?
说是换的几率大些。
我觉得换不换几率都是一样的啊。
就是好奇,所以写个测试用例看下。
测试总结
小心翼翼的增加 for 循环的次数,生怕电脑崩溃。没想到10万次循环也能快速出结果,现代计算机性能真不错。
随着 for 循环次数增加,R1 R2 的结果越接近,符合预期。
测试预览
源码分享
<body>
<p>题目:开门抽奖</p>
<p>三扇门对应三种奖品:羊,羊,车。</p>
<p>round1:嘉宾选择一扇门如 A 门</p>
<p>round2:主持人选一扇门如 B 门(羊)(选中车游戏结束)</p>
<p>round3:嘉宾可以决定是否更换选择</p>
<p>R1 不更换:仍选择 A 门</p>
<p>R2 更换:选择 C 门</p>
<p>问 R1 和 R2 哪种选择,选中车的几率比较大?</p>
<button onclick="start()">开始测试</button>
</body>
<script>
//得到一个两数之间的随机整数,包括两个数在内
function getRandomIntInclusive(min, max) {
//Math.ceil() 函式会回传大于等于所给数字的最小整数。
min = Math.ceil(min);
max = Math.floor(max);
return Math.floor(Math.random() * (max - min + 1)) + min; //含最大值,含最小值
}
//概率记录
var isCar1=1,isSheep1=1;
function test1(){
var arr=["car","sheep","sheep"];
var s1=getRandomIntInclusive(0,2)
var round1=arr[s1]
arr.splice(s1,1)
var s2=getRandomIntInclusive(0,1)
var round2=arr[s2]
if(round2 =='car'){
return false
}else{
//是否更换
//否
if(round1 == 'car'){
isCar1++
}else{
isSheep1++
}
}
}
var isCar2=1,isSheep2=1;
function test2(){
var arr=[
{"goal":"car","sel":false},
{"goal":"sheep","sel":false},
{"goal":"sheep","sel":false}
];
var s1=getRandomIntInclusive(0,2)
var round1=arr[s1].goal
arr[s1].sel=true
arr.splice(s1,1)
var s2=getRandomIntInclusive(0,1)
var round2=arr[s2].goal
arr[s2].sel=true
if(round2 =='car'){
return false
}else{
//是否更换
//是
var round3=arr.find(item=>item.sel == false)
if(round3.goal == 'car'){
isCar2++
}else{
isSheep2++
}
}
}
function start(){
for(var i=0;i<100000;i++){
test1();
test2();
}
var r1=isCar1/isSheep1;
var r2=isCar2/isSheep2;
console.log("isCar1 = " + isCar1)
console.log("isSheep1 = " + isSheep1)
console.log("r1 = " + r1)
console.log("\n")
console.log("isCar2 = " + isCar2)
console.log("isSheep2 = " + isSheep2)
console.log("r2 = " + r2)
console.log("\n")
if(r2 > r1){
console.log("换 比较好")
}else{
console.log("不换 比较好")
}
}
//全局属性 Infinity 是一个数值,表示无穷大。
</script>