一道概率题 疯子坐飞机问题

来自博客园的一道概率题 感觉蛮有趣味的

原题

飞机上有100个座位,按顺序从1到100编号。有100个乘客,他们分别拿到了从1号到100号的座位,他们按号码顺序登机并应当对号入座,如果他们发现对应号座位被别人坐了,他会在剩下空的座位随便挑一个坐。现在假如1号乘客疯了 -_-! (其他人没疯),他会在100个座位中随机坐一个座位。那么第100人正确坐自己座位的概率是多少?

注意登机是从1100按顺序的。

出题的博主提供的解法看似巧妙其实缺乏说服性或者根本就是错误的。

其实用概率推导还是可以比较容易找到规律,简证如下:

2号坐对的概率是99/100
至于3号做错的概率是 = 1/100 {一号坐在三号上}+ 1/100{二号坐错了} X 1/99 {二号坐在三号上} = 1/99
所以3号坐对的概率是1 - 1/99 = 98/99

依次可以证明4号 = 1-(1/100 {一号坐在四号上}+ 1/100{二号坐错了} X 1/99 {二号坐在四号上} + 1/99{三号 坐错了} X 1/98 {三号坐在三四上})= 97/98
。。。

99号 = 2/3

100号 = 1/2

以下是验证代码。可以修改参数测试某个座位的概率值,程序显示了理论值(第一行)和实验值(第二行)。

复制代码
static void Main(string[] args)
{
    
int total_seats = 100//总共多少座位
    int which_seat = 100;  //哪个座位?从1算起
    
    
int test_count = 10000;
    
int true_value = 0;

    
for (int i = 0; i < test_count; i++)
    {
        
if (isRightSeat(total_seats, which_seat))
            true_value
++;
    }
    Console.WriteLine((
double)(100 - which_seat + 1/ (double)(100 - which_seat + 2));
    Console.WriteLine(true_value 
/ (double)test_count);
    Console.ReadKey();
}

static Random rnd = new Random();

static bool isRightSeat(int total, int pos)
{
    
int[] seats = new int[total];
    List
<int> positions = Enumerable.Range(0, total).ToList();

    
int n = pos;
    
    
for (int i = 0; i < n; i++)
    {

        
if (i == 0 || seats[i] != 0)
        {
            
int p = rnd.Next(positions.Count);
            
int next_seat = positions[p];
            positions.RemoveAt(p);
            seats[next_seat] 
= i + 1;
        }
        
else
        {
            seats[i] 
= i + 1;
            positions.Remove(i);
        }
    }

    
return seats[pos - 1== pos;
}
复制代码

 

posted @   dragonpig  阅读(1632)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述
点击右上角即可分享
微信分享提示