三门问题-Swift测试

news2024/11/22 18:01:37

三门问题(Monty Hall problem)亦称为蒙提霍尔问题、蒙特霍问题或蒙提霍尔悖论,大致出自美国的电视游戏节目Let's Make a Deal。问题名字来自该节目的主持人蒙提·霍尔(Monty Hall)。

参赛者会看见三扇关闭了的门,其中一扇的后面有一辆汽车,选中后面有车的那扇门可赢得该汽车,另外两扇门后面则各藏有一只山羊。

当参赛者选定了一扇门,但未去开启它的时候,节目主持人开启剩下两扇门的其中一扇,露出其中一只山羊。主持人其后会问参赛者要不要换另一扇仍然关上的门。

问题是:换另一扇门是否会增加参赛者赢得汽车的机率?如果严格按照上述的条件,那么答案是会。不换门的话,赢得汽车的几率是1/3。换门的话,赢得汽车的几率是2/3。

听着确实是挺反直觉的,但是自己写代码测试确实也是这样的。流言终结者也有一起视频做了证据。

https://www.ixigua.com/7063739968274825735?id=7137582632111604231

解释1:

总共有三种可能的情况,全部都有相等的可能性(1/3):

参赛者挑山羊一号(1/3),主持人挑山羊二号。转换将赢得汽车。

参赛者挑山羊二号(1/3),主持人挑山羊一号。转换将赢得汽车。

参赛者挑汽车(1/3),主持人挑羊一号。转换将失败。

每种情况出现的概率都为1/3,所以切换策略最终赢得汽车的概率为2/3.

还有一种思路,解释2:

第一次选的空门(概率2/3),之后主持人开另一个空门,换门,得到汽车。

第一次选的汽车(概率1/3),之后主持人开一个空门,换门,失败。

import Foundation

// 测试总次数
let count = 100000

func userPlayGame(strategy: Int) {

    var result: [(Int,Bool)] = []

    for i in 0 ..< count {
        let game = DoorGame()
        game.userStrategy = strategy
        let oneGameResult = game.startPlay()
        let item = (i,oneGameResult)
        result.append(item)
    }

    let winArray = result.filter { item in
        return item.1
    }
    let rate = Double(winArray.count) / Double(count)

    var str = ""
    if (strategy == 0) {
        str = "原选择"
    } else if (strategy == 1) {
        str = "切换"
    } else if (strategy == 2){
        str = "随机切换"
    }
    print("用户游玩\(count)次,使用\(str)策略,\(winArray.count)次胜利,胜率:\(rate)")
//    print("原始数据",result)
}

userPlayGame(strategy: 0)
userPlayGame(strategy: 1)
userPlayGame(strategy: 2)
class DoorGame {
    // 用户策略
    // 0: 不改变选择
    // 1: 改变选择
    // 2: 50%改策略,50%不改
    var userStrategy = 0

    // 只是为了方便解释值的含义
    enum Strategy: Int {
        case notChange = 0 // 必定坚持原选择
        case change = 1 // 必定改变原选择
        case randomChange = 2 // 50%改变选择, 50%坚持原选择
    }

    enum DoorResult: Int {
        case sheepNotKnow = 0 // 门后是羊
        case car = 1 // 门后是车
        case sheepKnow = 2 // 主持人打开的门,必定是羊
    }

    func startPlay() -> Bool {

        // 生成3道门的数据
        var doorArray = self.buildRandomData()
        // 用户第一次选择
        var userSelect = self.userSelect()
        // 主持人排除一个错误答案, 剩余的结果
        doorArray = self.removeOneSheep(array: doorArray, userSelect: userSelect)

        // 根据用户策略决定是否转换
        if (self.userStrategy == 1) {
            userSelect = self.userChangeDoor(array: doorArray, userSelect: userSelect)
        } else if (self.userStrategy == 2) {
            let random = Int.random(in: 0 ..< 1000)
            if random % 2 == 0 {
                userSelect = self.userChangeDoor(array: doorArray, userSelect: userSelect)
            }
        }
        // 计算用户最终是否赢得车
        let result = self.showResult(array: doorArray, userSelect: userSelect)
        return result
    }

    /// 生成随机数据
    func buildRandomData() -> [Int] {
        var array = [0,0,0]
        let carIndex = Int.random(in: 0...2)
        array[carIndex] = 1
        return array
    }

    // 用户进行选择
    func userSelect() -> Int {
        let userSelect = Int.random(in: 0...2)
        return userSelect
    }


    // 主持人排除一个错误答案
    func removeOneSheep(array: [Int], userSelect: Int) -> [Int] {

        var result = array
        for (i,value) in array.enumerated() {

            if i == userSelect {
                continue
            } else {
                // 找到第一个是羊的门,变更成已知羊状态
                if value == 0 {
                    result[i] = 2
                    break
                }
            }
        }
        return result
    }


    // 用户改变自己的选择
    func userChangeDoor(array: [Int], userSelect: Int) -> Int {

        var result = -1
        // [2,1,0]  用户当前选中为1
        for (i,value) in array.enumerated() {

            if i == userSelect {
                continue
            } else {
                // 找到第一个是羊的门,移除这条数据
                if value == 2 {
                    continue
                } else {
                    result = i
                }
            }
        }
        assert(result != -1, "出错了")
        return result
    }

    /// 展示结果
    /// - Parameters:
    /// - Returns: true: 用户赢得车;  false: 用户失败
    func showResult(array: [Int], userSelect: Int) -> Bool {
        let value = array[userSelect]
        if value == 1 {
            return true
        }
        return false

    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1045855.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Camera Metadata跨进程传递

google camera2的参数设置都是通过CaptureRequest来设置的&#xff0c;相关的对象都实现了Parcelable接口才能进行跨进程传递。 一、整个Metadata的传递 1、CameraDeviceImpl.java 无论是capture还是repeating都会调用到下面的 submitRequestList 方法 mRemoteDevice就是Cam…

得物API元数据中心探索与思考

一、背景 目前市面上针对API的管理平台很多&#xff0c;但由于各种客观因素&#xff0c;这些平台的功能都更多聚焦在API文档的消费侧。而对于API文档的生成都非常依赖开发人员的手动创建&#xff0c;很难保障文档的实时性和有效性。市面上常见的API管理平台&#xff0c;由于缺…

【C++】笔试训练(二)

目录 一、选择题二、编程题1、排序子序列2、倒置字符串 一、选择题 1、1. 使用printf函数打印一个double类型的数据&#xff0c;要求&#xff1a;输出为10进制&#xff0c;输出左对齐30个字符&#xff0c;4位精度。以下哪个选项是正确的&#xff1f; A %-30.4e B %4.30e C %-3…

zookeeper mac安装

目录 1.下载zookeeper安装包 2.解压安装包 3.修改配置文件 4.启动服务端 5.启动客户端 这边工作中用到了zookeeper组件&#xff0c;但自己独立安装弄的不太多&#xff0c;这边本机mac装一个做测试使用 以下是安装记录&#xff0c;可以作为参考 从以下链接zookeeper版本列…

【二】xxl-job 源码分析

xxl-job 源码分析 简介&#xff1a;阅读优秀的开源项目源码总是一件让人激动的事情&#xff0c;分布式调度平台xxl-job我们在生产环境也是有了很多的实践应用&#xff0c;一款产品使用久了对其实现原理多少有些了解了&#xff0c;今天也是抽出整块的时间来认真分析一下xxl-job的…

RFID技术:钢条加工现场的智能化管理利器

RFID技术&#xff1a;钢条加工现场的智能化管理利器 RFID&#xff08;Radio Frequency Identification&#xff09;技术作为一种非接触式自动识别技术&#xff0c;近年来在工业领域得到广泛应用。本文将探讨RFID在钢条加工现场的应用&#xff0c;包括材料追踪与管理、生产过程…

【LeetCode热题100】--560.和为K的子数组

560.和为K的子数组 示例2的结果&#xff1a; 输入&#xff1a;nums [1,2,3] ,k3的时候 连续子数组有[1,2],[3]&#xff0c;一共有2个 利用枚举法&#xff1a; 枚举[0,…i]里所有的下标j来判断是否符合条件 class Solution {public int subarraySum(int[] nums, int k) {i…

Redis高可用之持久化、主从复制(附配置实例)

目录 一、Redis高可用1.1 简介1.2 高可用策略 二、Redis 持久化2.1 简介2.2 redis 的 2 种持久化方式2.2.1 RDB持久化2.2.2 AOF持久化 三、Redis主从复制3.1 什么是主从复制&#xff1f;3.2 为什么要用主从复制&#xff1f;3.3 主从复制的特性3.4 主从复制工作原理3.4.1 全量复…

Java项目-Spring Boot的生鲜网上交易系统

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 文章目录 1 简介2 技术栈3 系统功能4 功能设计5系统详细设计5.1系统功能模块5.2后台功能模块5\.2\.1用户功…

TextSniper for Mac: 革新您的文本识别体验

你是否曾经需要从图片或扫描文档中提取文本&#xff0c;却苦于没有合适的工具&#xff1f;那么&#xff0c;TextSniper for Mac将是你的完美解决方案。这款文本识别工具将彻底改变你处理图像和扫描文件的方式&#xff0c;让你更快速、更高效地完成任务。 TextSniper for Mac 是…

直流负载箱的使用场景和应用范围是什么?

直流负载箱是用于模拟电子设备负载的测试仪器&#xff0c;用于电源供应器、逆变器、电池等直流电源设备的性能测试和负载仿真&#xff0c;它可以模拟各种负载条件&#xff0c;以便测试和评估电源设备在不同负载情况下的工作性能&#xff0c;直流负载箱的使用场景和应用范围广泛…

Jmeter状态码及请求

Jmeter与LR的区别? 1.都是压测工具&#xff0c;可以用来做性能测试&#xff0c;但是Jmeter比较轻量级。jmeter 是用java语言写的&#xff0c;需要java环境&#xff0c;LR不需要&#xff0c;除非用iavavuser协议 (不用掌握) 2.Jmeter更偏向于功能和技术&#xff0c;LR偏向于业务…

VME-7807RC-414001 350-93007807-414001 VMIVME-017807-411001 VMIVME-017807-414001

VME-7807RC-414001 350-93007807-414001 VMIVME-017807-411001 VMIVME-017807-414001 由于第12代英特尔酷睿处理器的16核/24线程配置&#xff0c;Nuvo-9000型号与之前的平台相比&#xff0c;性能大幅提升。它们还支持新的DDR5内存标准&#xff0c;以获得更多内存带宽&#xf…

气传导耳机有哪些品牌?性能不错的气传导耳机分享

​气传导耳机采用空气传导技术&#xff0c;使声音传递更加自然舒适。随着气传导耳机的创新发展&#xff0c;越来越多用户不知道气传导耳机该怎么选了&#xff0c;所以今天我来推荐几款相当不错的气传导耳机给大家参考&#xff0c;享受音乐时不受耳道压力的困扰。 一、NANK南卡…

电力智能化运维平台:提高效率和保障电力系统的稳定运行

随着信息技术、人工智能、物联网的发展&#xff0c;电力系统的规模和复杂性也在不断增长。为了确保电力系统的稳定运行&#xff0c;传统的运维方式已经无法满足需求。电力智能化运维平台应运而生&#xff0c;为电力行业带来了全新的运维模式和技术手段。 电力智能化运维平台…

密歇根大学发布3款生成式AI产品,并应用在教学、日常工作!

密歇根日报消息&#xff0c;美国顶级公立大学-密歇根大学宣布推出3款生成式AI产品UM-GPT、UM-GPT开发包和UM-Maizey&#xff0c;并将其应用在教学、日常工作、学术研究等领域。微软也参与了此次产品研发&#xff0c;并提供技术支持。 密歇根大学将为安娜堡分校、弗林特分校、迪…

重学C++ | std::set 的原理

std::set 是C标准库中的容器之一&#xff0c;它基于红黑树实现。std::set 利用红黑树的特性来实现有序的插入、查找和删除操作&#xff0c;并且具有较好的平均和最坏情况下的时间复杂度。 当向 std::set 插入元素时&#xff0c;它会按照特定的比较函数&#xff08;bool less<…

优化您的Mac系统,提升性能——TinkerTool System for Mac

TinkerTool System for Mac 是一款功能强大的系统维护工具&#xff0c;为您提供了一系列优化和排错工具&#xff0c;帮助您轻松管理和提升Mac系统的性能。不论您是普通用户还是高级用户&#xff0c;这款应用程序都能满足您的需求&#xff0c;让您的Mac保持高效稳定。 TinkerTo…

java项目之人事管理系统(ssm源码+文档)

项目简介 人事管理系统实现了以下功能&#xff1a; 管理员&#xff1a;个人中心、员工管理、部门经理管理、部门信息管理、员工考勤管理、签到管理、请假申请管理、工资查询管理、部门类型管理.部门经理&#xff1a;个人中心、员工管理、部门信息管理、员工考勤管理、签到管理…

【rhce考试时间是每年什么时候呢?】

RHCE9.0 新技术 公开课 10月11日&#xff0c;12日 感兴趣可留言 如果你是一个系统管理员&#xff0c;或者正朝着这个方向努力前进&#xff0c;那么你可能已经听过RHCE这个词。RHCE是Red Hat Certified Engineer的缩写&#xff0c;是全球公认的Linux系统工程师认证之一。通过获…