---------------------------------------------------------------------
-- Auxiliry Table of Numbers 数字辅助表
--------------------------------------------------------------------- -- Listing 4-8: Creating and Populating Auxiliary Table of Numbers
SET NOCOUNT ON;
USE AdventureWorks;
GO
IF OBJECT_ID('dbo.Nums') IS NOT NULL
DROP TABLE dbo.Nums;
GO
CREATE TABLE dbo.Nums(n INT NOT NULL PRIMARY KEY);
DECLARE @max AS INT, @rc AS INT;
SET @max = 1000000;
SET @rc = 1; INSERT INTO Nums VALUES(1);
WHILE @rc * 2 <= @max
BEGIN
INSERT INTO dbo.Nums SELECT n + @rc FROM dbo.Nums;
SET @rc = @rc * 2;
END INSERT INTO dbo.Nums
SELECT n + @rc FROM dbo.Nums WHERE n + @rc <= @max;
GO -- Naive Solution Returning an Auxiliary Table of Numbers
DECLARE @n AS BIGINT;
SET @n = 1000000; WITH Nums AS
(
SELECT 1 AS n
UNION ALL
SELECT n + 1 FROM Nums WHERE n < @n
)
SELECT n FROM Nums
OPTION(MAXRECURSION 0);
GO -- Optimized Solution 1
DECLARE @n AS BIGINT;
SET @n = 1000000; WITH Base AS
(
SELECT 1 AS n
UNION ALL
SELECT n + 1 FROM Base WHERE n < CEILING(SQRT(@n))
),
Expand AS
(
SELECT 1 AS c
FROM Base AS B1, Base AS B2
),
Nums AS
(
SELECT ROW_NUMBER() OVER(ORDER BY c) AS n
FROM Expand
)
SELECT n FROM Nums WHERE n <= @n
OPTION(MAXRECURSION 0);
GO -- Optimized Solution 2
DECLARE @n AS BIGINT;
SET @n = 1000000; WITH
L0 AS(SELECT 1 AS c UNION ALL SELECT 1),
L1 AS(SELECT 1 AS c FROM L0 AS A, L0 AS B),
L2 AS(SELECT 1 AS c FROM L1 AS A, L1 AS B),
L3 AS(SELECT 1 AS c FROM L2 AS A, L2 AS B),
L4 AS(SELECT 1 AS c FROM L3 AS A, L3 AS B),
L5 AS(SELECT 1 AS c FROM L4 AS A, L4 AS B),
Nums AS(SELECT ROW_NUMBER() OVER(ORDER BY c) AS n FROM L5)
SELECT n FROM Nums WHERE n <= @n;
GO -- Listing 4-9: UDF Returning an Auxiliary Table of Numbers
IF OBJECT_ID('dbo.fn_nums') IS NOT NULL
DROP FUNCTION dbo.Nums;
GO
CREATE FUNCTION dbo.fn_nums(@n AS BIGINT) RETURNS TABLE
AS
RETURN
WITH
L0 AS(SELECT 1 AS c UNION ALL SELECT 1),
L1 AS(SELECT 1 AS c FROM L0 AS A, L0 AS B),
L2 AS(SELECT 1 AS c FROM L1 AS A, L1 AS B),
L3 AS(SELECT 1 AS c FROM L2 AS A, L2 AS B),
L4 AS(SELECT 1 AS c FROM L3 AS A, L3 AS B),
L5 AS(SELECT 1 AS c FROM L4 AS A, L4 AS B),
Nums AS(SELECT ROW_NUMBER() OVER(ORDER BY c) AS n FROM L5)
SELECT n FROM Nums WHERE n <= @n;
GO -- Test function
SELECT * FROM dbo.fn_nums(10) AS F;
GO --蒙提霍尔问题
--https://math.ucsd.edu/~crypto/Monty/montybg.html
--Steve Kass --用T-SQL(2005)模拟蒙提霍尔问题
--访问:https://math.ucsd.edu/~crypto/Monty/montybg.html
--可以找到该问题的描述
WITH T0 AS
(
SELECT
--prize_door 是概率相同的门,1,2,3
1+ABS(BINARY_CHECKSUM(NEWID()))%3 AS prize_door
FROM dbo.Nums
WHERE n<=100000 --尝试的次数
--任何表都行,只要不要太小
),
T1 AS
(
SELECT prize_door,
--your_door 是概率相同的门,1,2,3
1+ABS(BINARY_CHECKSUM(NEWID()))%3 AS your_door
FROM T0
),
T2 AS
(
SELECT
prize_door,
your_door,
CASE
WHEN prize_door<>your_door THEN 6-prize_door-your_door
ELSE SUBSTRING(REPLACE('123',RIGHT(your_door,1),''),1+ABS(BINARY_CHECKSUM(NEWID()))%2,1)
END AS open_door
FROM T1
),
T3 AS
(
SELECT prize_door,your_door,open_door,
-- other door 是你最初没有选择的仍然关闭的门
6-your_door-open_door AS other_door
FROM T2
),
T4 AS
(
SELECT COUNT(CASE WHEN prize_door=your_door
THEN 'don''t switch' END) AS staying_wins,
COUNT(CASE WHEN prize_door=other_door
THEN 'do switch' END) AS switching_wins,
COUNT(*) AS trials
FROM T3
)
SELECT trials,CAST(100.0*staying_wins/trials
AS DECIMAL(5,2)) AS staying_winsPercent,
CAST(100.0*switching_wins/trials
AS DECIMAL(5,2)) AS switching_winsPercent
FROM T4;
GO ---T-SQL Simulator for Monty Hall Paradox
declare @counter int = 0
declare @maxGames int = 1000
declare @randomPrizeDoor tinyint
declare @randomChoosenDoor tinyint
declare @randomOpenedDoor tinyint -- Games
declare @games table
(
GameId int not null identity(1, 1),
PrizeDoor tinyint not null,
ChoosenDoor tinyint not null,
HostOpensDoor tinyint not null,
ResultIfYouStay as case when PrizeDoor = ChoosenDoor then 1 else 0 end,
ResultIfYouSwitch as case when PrizeDoor = ChoosenDoor then 0 else 1 end
) while @counter < @maxGames
begin
-- Hosts put a prize behind random door 1-3
SELECT @randomPrizeDoor = ABS(CAST(NEWID() AS binary(6)) %3) + 1 FROM sysobjects -- Player randomly selects one door 1-3
SELECT @randomChoosenDoor = ABS(CAST(NEWID() AS binary(6)) %3) + 1 FROM sysobjects -- Host shows one door where there is no prize
SELECT TOP 1 @randomOpenedDoor = Door
FROM (select 1 as Door union all select 2 union all select 3) T
WHERE T.Door not in (@randomPrizeDoor, @randomChoosenDoor) insert into @games(PrizeDoor, ChoosenDoor, HostOpensDoor)
select @randomPrizeDoor, @randomChoosenDoor, @randomOpenedDoor
set @counter = @counter + 1
end select 1.0 * sum(ResultIfYouStay) / @maxGames as ChancesToWinIfYouStay, 1.0 * sum(ResultIfYouSwitch) / @maxGames as ChancesToWinIfYouSwitch
from @games
GO

  https://www.codeproject.com/Articles/16179/The-Monty-Hall-Problem-C-Solution

https://www.codeproject.com/Articles/30473/Monty-Hall-Paradox-Illustrated

sql server:Monty Hall problem (蒙提霍尔问题)的更多相关文章

  1. zzulioj--1712--Monty Hall problem(蒙提霍尔问题)

     1721: Monty Hall problem Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 186  Solved: 71 SubmitSt ...

  2. 羊和汽车问题(或s三门问题(Monty Hall problem)亦称为蒙提霍尔问题)

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

  3. 用贝叶斯定理解决三门问题并用Python进行模拟(Bayes' Rule Monty Hall Problem Simulation Python)

    三门问题(Monty Hall problem)也称为蒙提霍尔问题或蒙提霍尔悖论,出自美国的电视游戏节目<Let’s Make a Deal>.问题名字来自该节目的主持人蒙提·霍尔(Mon ...

  4. The Monty Hall Problem

    GNG1106 Lab 3The Monty Hall ProblemBackgroundThe Monty Hall Problem is a famous probability puzzle, ...

  5. Monty Hall Problem (三门问题)

    最近有点忙,没怎么写程序...今天突然想起以前看到过的一个问题-三门问题,十分想用程序来模拟一下,于是实在忍不住了就模拟了这个游戏的实验,通过写程序更加加深了我对这个问题的理解,期间也查找了各种相关资 ...

  6. Monty 大厅问题(Monty Hall Problem)也称作三门问题,出自美国大型游戏节目 Let's Make a Deal。

    Monty 大厅的问题陈述十分简单,但是它的答案看上去却是有悖常理.该问题不仅引起过很多争议,也经常出现在各种考试题中. Monty 大厅的游戏规则是这样的,如果你来参加这个节目,那么 (1)Mont ...

  7. Monty Hall Problem的一个图解,感觉不错

    从Coursera.org上的台大概率课讨论组里拿来的 如果不转换,选中汽车的概率是1/3,非常显然. 但转换后选中汽车的概率变成2/3就有点反直觉了,并不是太容易想明白. 因为转换其实有4种:汽车- ...

  8. Monty Hall 问题与贝叶斯定理的理解

     三门问题(Monty Hall problem),是一个源自博弈论的数学游戏问题,大致出自美国的电视游戏节目Let's Make a Deal.问题的名字来自该节目的主持人蒙提·霍尔(Monty H ...

  9. 用python验证蒙提霍尔问题

    最初看到这个问题是初中的时候买了一本有关数学谜题的书里面概率论的一张的课后拓展就是说到三门问题,当时作为一个扩展阅读看了一下,里面说到了一个世界智商最高的女人秒杀了美国一大群的数学高材生的精彩故事(比 ...

随机推荐

  1. .NET Core微服务之路:让我们对上一个Demo通讯进行修改,完成RPC通讯

    最近一段时间有些事情耽搁了更新,抱歉各位了. 上一篇我们简单的介绍了DotNetty通信框架,并简单的介绍了基于DotNetty实现了回路(Echo)通信过程. 我们来回忆一下上一个项目的整个流程: ...

  2. ASP.NET Core 请求/查询/响应参数格式转换(下划线命名)

    业务场景: 在 ASP.NET Core 项目中,所有的代码都是骆驼命名,比如userName, UserName,但对于 WebApi 项目来说,因为业务需要,一些请求.查询和响应参数的格式需要转换 ...

  3. 还原一直卡在ASYNC_IO_COMPLETION浅析

    下面在还原一个数据库(备份文件40多G大小,实际数据库大小300G),在还原过程中,出现一直等待ASYNC_IO_COMPLETION,如下测试截图所示,已经等待了72分钟了,但是还原比例依然为0% ...

  4. 牛客JS编程大题(二)

    11.统计数组 arr 中值等于 item 的元素出现的次数 function count(arr, item) { var num = 0; for(var i = 0;i < arr.len ...

  5. maya2012卸载/安装失败/如何彻底卸载清除干净maya2012注册表和文件的方法

    maya2012提示安装未完成,某些产品无法安装该怎样解决呢?一些朋友在win7或者win10系统下安装maya2012失败提示maya2012安装未完成,某些产品无法安装,也有时候想重新安装maya ...

  6. Appium移动自动化测试入门及简单实例(python)

    1.介绍 Appium是一个移动端的自动化框架,可用于测试原生应用.移动网页应用和混合型应用,且是跨平台的.可用于IOS和Android以及firefox的操作系统.原生的应用是指用android或i ...

  7. 影响 POST 请求文件上传失败的几个环节的配置(php + nginx)

    写在前面 最近写一个 php 接口,接受上传的文件,发现文件只要超过 5m 以上就会无响应失败,最后发现是 shadowsocks 的 timeout 设置问题(我全程开了全局的 VPN),但一开始并 ...

  8. 简介 - RESTful

    RESTful REST(Representational State Transfer,表现层状态转化),可以简单理解为"资源在网络中以某种表现形式进行状态转移" Resourc ...

  9. LeetCode:21_Merge Two Sorted Lists | 合并两个排序列表 | Easy

    题目:Merge Two Sorted Lists Merge two sorted linked lists and return it as a new list. The new list sh ...

  10. linux中一些简便的命令之cut

    提中的这些命令都是些小命令,很简便,在工作过程中经常使用,具体使用方法如下: cut 使用说明:一般是把某个整齐的文档输出其中某列使用 常用的参数有: -f 选择打印的列 -d 指定定界符(默认定界符 ...