三门问题-Swift测试

这篇具有很好参考价值的文章主要介绍了三门问题-Swift测试。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

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

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

三门问题-Swift测试,swift,开发语言,ios

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

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),之后主持人开一个空门,换门,失败。

三门问题-Swift测试,swift,开发语言,ios文章来源地址https://www.toymoban.com/news/detail-731695.html

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

    }
}

到了这里,关于三门问题-Swift测试的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • iOS开发Swift-枚举

    枚举:一组相关的值定义了一个共同的类型,使你可以在代码中以类型安全的方式来使用这些值。 原始值:定义枚举时被预先填充的值。 (1)整数为原始值时,隐式赋值递增1。未设置原始值时,默认为0,之后递增1. (2)字符串为原始值,隐式赋值为枚举成员的名称。

    2024年02月11日
    浏览(36)
  • iOS开发Swift-控制流

    (1)复合匹配 (2)区间匹配 (3)元组匹配 (4)值绑定匹配 (5)where continue, break, fallthrough, return, throw continue: 停止本次循环,开始下次循环 break: 立即结束整个控制流。可以使用break忽略switch的分支。 fallthrough贯穿: switch中的case加入贯穿,case会穿透到下一个case/ default。

    2024年02月11日
    浏览(41)
  • iOS开发Swift-基础部分

    系统可通过赋初始值进行自动推断。 平时可加可不加,同一行中有两句话必须加。 Int           UInt(最好不用) Double 64位 很大/高精度情况下使用 15位小数 Float 32位 对精度要求不高的情况下用 6位小数 十进制数   17 二进制 0b前缀 0b10001 八进制 0o前缀 0o21 十六进制 0x前缀

    2024年02月11日
    浏览(40)
  • iOS开发Swift-集合类型

    集合基本类型:数组 Array (有序), 集合 Set (无序不重复), 字典 Dictionary (无序键值对) (1)数组的表示 (2)创建空数组 (3)带值数组 (4)两数组相加创建数组 (5)字面量创造数组 (6)访问数组 (7)添加 (8)修改 (9)删除 (10)遍历 同时需要索引和值时: (1)集合的表示 (2)构造一个集合 (3)字面

    2024年02月11日
    浏览(38)
  • iOS开发Swift-类型转换

    1.Int或Double转字符串 2.Double转Int(去掉小数点后面的) 3.Int转Double 4.向上转型 5.向下转型

    2024年02月09日
    浏览(31)
  • XCTest iOS Swift单元测试(1),涨姿势

    // // XCTestDemoTests.swift // XCTestDemoTests // // Created by Nvr on 2018/7/6. // Copyright © 2018年 ZY. All rights reserved. // import XCTest @testable import XCTestDemo class XCTestDemoTests: XCTestCase { var f1:Float? var f2:Float? override func setUp() { super.setUp() // Put setup code here. This method is called before the invocation of each test me

    2024年04月22日
    浏览(29)
  • iOS开发Swift-基本运算符

    一元 单一操作对象 -a    !b    c! 二元 两个操作对象 2 + 3 三元 三目运算符 a ? b : c 赋值运算符不返回任何值,所以 if x = y { ... } 无效。 +   -   *   / 默认不允许数值运算中溢出。 溢出运算符:   a + b a % b = 余数 a = (b * 倍数) + 余数 所以a % b = a % -b ==     !=         

    2024年02月11日
    浏览(35)
  • iOS开发Swift-1-Xcode创建项目

    1.创建项目 双击Xcode App,选择Create a new Xcode project。  选择创建一个iOS普通的App项目。选择Single View App,点击Next。  填写项目名,组织名称等,点击next。  选择好文件的存储路径,点击create。  2.为前端添加组件 点击Main,选中View,在右下角show the Object library中找到label组件,

    2024年02月10日
    浏览(28)
  • iOS开发Swift-字符串与字符

     前一个\\\"\\\"\\\"前和后一个\\\"\\\"\\\"后无换行  想要实现在代码编写时换行而在实际运行后不换行:  (1)转义字符 \\0 空字符 \\\\ 反斜线 t 水平制表符 n 换行符 r 回车符 \\\" 双引号 \\\' 单引号 要在\\\"\\\"\\\"中使用(\\\"\\\"\\\")时,必须至少写一个转义符。例如 \\\"\\\"\\\" 或 \\\"\\\"\\\" (2)Unicode标量 u{24} 两位十六进制

    2024年02月11日
    浏览(32)
  • iOS(一):Swift纯代码模式iOS开发入门教程

    1.修改 AppDelegate.swift 和 ViewController.swift 文件 2.删除 SceneDelegate.swift 和 Main.storyboard 文件 3.修改如图所示项 安装 CocoaPods 初始化项目(添加 Podfile 配置文件) 修改 Podfile 文件 安装 打开 ExDemoApp.xcworkspace 项目并向 ViewController.swift 添加示例代码 运行效果 安装 QMUIKit 方式一:触发

    2024年02月09日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包