游侠NETSHOW论坛

标题: 简单的写个C++程序验证三门问题。(强人们出现!45楼更简洁、61、68楼Lua,71楼C#.net!) [打印本页]

作者: Mr.zhao[flying]    时间: 2011-8-8 10:16:15     标题: 简单的写个C++程序验证三门问题。(强人们出现!45楼更简洁、61、68楼Lua,71楼C#.net!)

本帖最后由 Mr.zhao[flying] 于 2011-8-9 12:30 编辑

前言:
你们都是大神级别的人物,我这种小鱼小虾如何能比。

只是看到前两天大家都在讨论这个问题,想通过自己的方式来验证答案。

没想到遭来了一群你们这样的人。

好吧,我再把那句话重复一遍,不喜勿进,喷子请滚出这个帖子。你牛逼,我惹不起,但是你别在我这一亩三分地里撒野装逼,谢谢。









代码不高端,力求简洁易懂。请各位多多指正。结果很明显换门中奖的概率应为2/3。

#include <stdio.h>
#include <iostream>
#include <time.h>
#include <windows.h>
using namespace std;
int main()
{
cout << "现在是100000次换门的情况:" << endl;
int a,b,c,temp1,temp2,zj=0,bzj=0,i;
    srand(GetTickCount());
for(i=1;i<100001;i++)
{
temp1=rand()%3+1;
switch(temp1)
{
case 1:{a=1;b=0;c=0;break;}
case 2:{a=0;b=1;c=0;break;}
case 3:{a=0;b=0;c=1;break;}
}
temp2=rand()%3+1;
switch(temp2)
{
case 1:{
  switch(temp1)
  {
  case 1:{bzj++;break;}
  case 2:{zj++;break;}
  case 3:{zj++;break;}
  }
  break;
     }
case 2:{
  switch(temp1)
  {
  case 1:{zj++;break;}
  case 2:{bzj++;break;}
  case 3:{zj++;break;}
  }
  break;
     }
case 3:{
  switch(temp1)
  {
  case 1:{zj++;break;}
  case 2:{zj++;break;}
  case 3:{bzj++;break;}
  }
  break;
     }
}
}
cout << "中奖次数为:" << zj << endl;
cout << "不中奖次数为:" << bzj << endl;
return 0;
}

用a,b,c模拟三个门内的奖品,用temp1模拟哪个门内存在奖品,用temp2模拟人的选择。



作者: kingzhou    时间: 2011-8-8 10:19:34

[害怕]我out了,两三天没上来就蹦出一个三门...什么情况
作者: kingzhou    时间: 2011-8-8 10:20:41

本帖最后由 kingzhou 于 2011-8-8 10:26 编辑

[害怕]连击了。。编辑掉。。
作者: Mr.zhao[flying]    时间: 2011-8-8 10:23:27

前两天综合区有人激烈讨论……
作者: choong1990    时间: 2011-8-8 10:30:19

你怎么搞不清楚状况,现在人家争论的是。
temp1=rand()%3+1;
到底开了个门后是,1/3还是1/2.。。
作者: Mr.zhao[flying]    时间: 2011-8-8 10:33:32

本帖最后由 Mr.zhao[flying] 于 2011-8-8 10:34 编辑

回复 choong1990 的帖子

难道是我对题目理解还不够么?

主持人事先知道奖品在哪个门后,玩家随机挑选三个门之一后主持人总能打开一个没有奖品的门,这还有争议么?

作者: a676766767    时间: 2011-8-8 10:35:29

汗...........难道全世界就只有我一个看不懂??????????
作者: eeyy    时间: 2011-8-8 10:55:53

a676766767 发表于 2011-8-8 10:35
汗...........难道全世界就只有我一个看不懂??????????

呵呵, 你这两天没来逛吧, 讨论的可激烈了

作者: lattit    时间: 2011-8-8 11:01:34

本帖最后由 lattit 于 2011-8-8 11:01 编辑

首先,C里面的随机数不是真正的随机数,而是伪随机数。
其次,为什么会有中奖是没中奖的两倍呢。
看你的程序:
case 1:{bzj++;break;}
  case 2:{zj++;break;}
  case 3:{zj++;break;}
里面明确的表示了,ZJ能加两次,而BZJ只加一次。。。
你这是什么算法啊。。。
作者: yhb19820419    时间: 2011-8-8 11:03:25

我是这两天上来论坛都是错误帖子显示,又不能回帖,现在好了![害怕]
作者: satan023    时间: 2011-8-8 11:05:07

好无聊 为什么大家都在讨论这个 和游戏有什么关系吗
作者: Mr.zhao[flying]    时间: 2011-8-8 11:06:14

回复 lattit 的帖子

....你真的研究过这个题目吗。

我打个比方 1、2门内没有奖品,3门内有奖品。

玩家选择1门,主持人开2门,此时换门中奖。
玩家选择2门,主持人开1门,此时换门中奖。
玩家选择3门,主持人任意开一门,此时换门不中奖。

作者: Mr.zhao[flying]    时间: 2011-8-8 11:09:00

回复 lattit 的帖子

至于随机数这个问题,是我程序本身所限,您说的非常正确。
在下次改进的时候我想用WindowsAPI来产生所谓完美的随机数。

作者: 乌鸦z    时间: 2011-8-8 11:17:40

Mr.zhao[flying] 发表于 2011-8-8 11:09
回复 lattit 的帖子

至于随机数这个问题,是我程序本身所限,您说的非常正确。

这个时候,真伪随机数已经不影响结果了



作者: playbus    时间: 2011-8-8 11:17:44

本帖最后由 playbus 于 2011-8-8 11:19 编辑
Mr.zhao[flying] 发表于 2011-8-8 11:06
回复 lattit 的帖子

....你真的研究过这个题目吗。

为什么你把玩家开3门,主持人开**作为一种情况?

主持人开1门和2门,此时换门都是不中奖的……

结果换与不换不还是一半对一半吗?

作者: plsmallpig11    时间: 2011-8-8 11:20:19

还在研究这个
真的认为哲学拯救世界么
作者: 402280828    时间: 2011-8-8 11:21:44

这种S B问题能火起来的原因就是游侠这帮脑残总希望有一个途径能自己说服自己不是一个脑残。事实上这是一个非常脑残的途径,造就了一种极端脑残甚至恶心的潮流。[害怕]
作者: Mr.zhao[flying]    时间: 2011-8-8 11:22:07

回复 playbus 的帖子

因为随机数temp2视为玩家的选择,而非主持人的选择。
当玩家一开始选择3门并准备换门时,无论主持人开哪个门都已决定了玩家无法获奖。

作者: Mr.zhao[flying]    时间: 2011-8-8 11:23:15

回复 402280828 的帖子

你的签名出卖了你。

不知道何种心理造就了你这种目空一切的态度。

我们只是在用自己的方式来探究未知事物的真相。

以上。

作者: covalentBond    时间: 2011-8-8 11:32:17

Mr.zhao[flying] 发表于 2011-8-8 11:06
回复 lattit 的帖子

....你真的研究过这个题目吗。

你把这个注释到代码里面去就不用费这么多时间来给人解释你的思路了。
作者: Mr.zhao[flying]    时间: 2011-8-8 11:33:52

回复 covalentBond 的帖子

懒得重新写进去了。懒人你懂的……
作者: DD51    时间: 2011-8-8 12:00:33

玩过剪刀石头布吗,每次都是胜,平,负各占3分之一,但你应该也遇到过连胜N次,连平N次,连负N次的时候吧,所以用这个程序解这道题本身就有问题,好像听说是叫什么混沌理论来着,另外你用VBS直接写出来让大家用浏览器看结果不是更好...
作者: 路人L    时间: 2011-8-8 12:07:13

回复 DD51 的帖子

石头剪刀布能连平10000次吗?用程序来模拟石头剪刀布市是没问题的,至于LZ的程序已经受其本身的思路影响了,只能说还原出了LZ对题目的理解,所以用程序来做这个题目是没有参考价值的

作者: Mr.zhao[flying]    时间: 2011-8-8 12:08:11

回复 DD51 的帖子

抛却随机数和伪随机数的问题,用机器代替人进行大量重复试验来逼近理论概率的方法是可取的。
至于VBS是真心不会,用VB写一个还行……

作者: Mr.zhao[flying]    时间: 2011-8-8 12:09:34

回复 路人L 的帖子

不是受我的思路的影响,我只是代替机器省去了必然事件的代码,其实要写上去也未尝不可,但结果相同,还浪费机器效率。
作者: china.gll2    时间: 2011-8-8 12:15:30

程序无法帮你解决任何逻辑问题,动手写之前结果就已经注定了。
作者: 路人L    时间: 2011-8-8 12:20:09

回复 Mr.zhao[flying] 的帖子

题目本身是不难的,出现两种答案无非是每个人对题目的理解不同,如果在理解错题意的情况下,你觉得你还能写出正确的程序吗?
作者: icefox1983    时间: 2011-8-8 12:22:23

choong1990 发表于 2011-8-8 10:30
你怎么搞不清楚状况,现在人家争论的是。
temp1=rand()%3+1;
到底开了个门后是,1/3还是1/2.。。 ...

别扯了。这个temp1只是最初奖品放在哪个门后的随机数。主持人的行为是不可能改变奖品为止的,这里当然是1/3
作者: Mr.zhao[flying]    时间: 2011-8-8 12:39:58

回复 路人L 的帖子

那么请问我的逻辑错误出现在何处?
作者: MichaelMorhaime    时间: 2011-8-8 12:40:49

一群傻帽                               ~

作者: horned    时间: 2011-8-8 12:54:15

本帖最后由 horned 于 2011-8-8 12:54 编辑

LZ再執行多10萬次,如果數據完全相同(或誤差%在少數位內),也就代表你的模擬是完全失敗的.
最好方法是選門用人手操作(注意操作者別記數),起碼是做到半真隨機.
那麼不用執行10萬次,有個100次就已經很令人信服了.[嘿嘿嘿]
作者: Mr.zhao[flying]    时间: 2011-8-8 12:57:49

回复 horned 的帖子

您说的有道理。

我前面也说了,C++的伪随机数是硬伤。
改进时我会考虑调用API来产生所谓完美的随机数。

作者: horned    时间: 2011-8-8 13:02:29

本帖最后由 horned 于 2011-8-8 13:20 编辑

回复 Mr.zhao[flying] 的帖子

選門還是用人手好,門給值就讓機器做.
那樣發個VB出來大家就可以自行驗證了.
執行次數必須在程序執行前讓用家選(100,300,500....這樣的檔次).換門及不換門都必須在執行前選定不能更改.
選完後才開始執行,只有玩完所有次數才顯示中獎與不中獎及已執行次數等信息.
其實對於這三門問題我是無脾氣了,2/3是必須在大量數據下才顯示出來的,在單次遊戲下1/2也有其道理.
作者: 402280828    时间: 2011-8-8 13:05:29

这帮狗P专家真是越来越得瑟了[害怕]
作者: Mr.zhao[flying]    时间: 2011-8-8 13:05:34

回复 horned 的帖子

好,等吃完饭就开始用VB写……
作者: Mr.zhao[flying]    时间: 2011-8-8 13:06:35

回复 402280828 的帖子

不喜勿进,可以么?

你何必与我们这群S|B一般计较,辱没了您的身份。

作者: easyb    时间: 2011-8-8 13:10:01

打算人手算100,300,500次嗎?!...
作者: horned    时间: 2011-8-8 13:12:07

回复 Mr.zhao[flying] 的帖子

別理他們,他們寂寞了.
越理他們,他們越變本加勵.

作者: 八仙过人    时间: 2011-8-8 13:13:03

计算机的随机数不可能完美的,多数还是根据硬件时间来模拟的……
作者: horned    时间: 2011-8-8 13:15:28

本帖最后由 horned 于 2011-8-8 13:17 编辑

回复 easyb 的帖子

是按鍵...
這個很快,就算死按同一選擇也無所謂的.
按100次應該不到2分鐘.

作者: 路人L    时间: 2011-8-8 13:20:56

回复 Mr.zhao[flying] 的帖子

没人说你错,只是说你的程序是按你自己的理解写出来的,看到“如果”没...
作者: Mr.zhao[flying]    时间: 2011-8-8 13:33:18

回复 路人L 的帖子

恩,我懂您的意思。
但是就题目本身来说,我采用这种方法还是可取的。

作者: Mr.zhao[flying]    时间: 2011-8-8 13:34:33

八仙过人 发表于 2011-8-8 13:13
计算机的随机数不可能完美的,多数还是根据硬件时间来模拟的……

您说得对。
这个问题是无法避免的,要避免就只能调用API或者采用一些随机库,那样未免太麻烦了些。

作者: lanhuacao    时间: 2011-8-8 13:35:32

本帖最后由 lanhuacao 于 2011-8-8 13:36 编辑

理论上计算机无法产生真的随机数。量子计算机应该可以,但问题是不知道现在有没有量子计算机,而且即使有它也不会支持c++.
当然我有更好的主意,就是让计算机计算pi,然后取其中数字。但是这个还不是完全随机数,因为它依存着pi,计算结果肯定和圆有很深的关系。
作者: xueyl    时间: 2011-8-8 13:53:35

本帖最后由 xueyl 于 2011-8-9 09:48 编辑

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

int main()
{
        int prizeDoor;    //中奖的门
        int selectDoor;  //一开始选的门
        int otherDoor;   //主持人选的门
        int *pool = malloc(sizeof(int)*2);
        int poolSize=0;
        int lastDoor;    //最后剩下的门(待换的)
        int i,j;
        int prizeTime=0;
        srand(time(NULL));
        for ( i = 0 ; i < 10000 ; i++ )
        {
                poolSize = 0;  //编辑添加,最开始忽视了这一句,所以造成33%
                prizeDoor = rand()%3 + 1;
                selectDoor = rand()%3 + 1;
                for ( j = 1 ; j <= 3 ; j++)
                        if ( j!= prizeDoor && j!= selectDoor )
                        {
                                pool[poolSize] = j;
                                poolSize++;
                        }
                otherDoor = pool[rand()%poolSize];
                for ( j = 1 ; j <=3 ; j++)
                        if ( j!= selectDoor && j!= otherDoor )
                                lastDoor = j;
                selectDoor=lastDoor;
                if (selectDoor == prizeDoor)   
                        prizeTime++;
        }
        printf("%d\n",prizeTime);
}


为何我的换门结果是33%,请指教

//问题参见55楼

作者: 乌鸦z    时间: 2011-8-8 14:07:26

xueyl 发表于 2011-8-8 13:53
#include
#include
#include

因为你让主持人随机选门了,没有"必须只开没有的门"

有1/3的几率是主持人选了有羊的门,但实际游戏里,这1/3的门主持人是不能开的,这个几率必须给选换门的游戏者.

作者: 乌鸦z    时间: 2011-8-8 14:09:58

horned 发表于 2011-8-8 13:02
回复 Mr.zhao[flying] 的帖子

選門還是用人手好,門給值就讓機器做.

这话说的,单次游戏里,换不换门都可能不中,莫非概率是0........

买了张彩票刚好中了了500W,莫非单次买彩票,中奖率100%.........


作者: xueyl    时间: 2011-8-8 14:10:59

回复 乌鸦z 的帖子

                for ( j = 1 ; j <= 3 ; j++)
                        if ( j!= prizeDoor && j!= selectDoor )
                        {
                                pool[poolSize] = j;
                                poolSize++;
                        }

请注意这几句,这个就是建立主持人可以选择的门的pool,而接下来otherDoor 是从这个pool里面选出来的

作者: xueyl    时间: 2011-8-8 14:12:04

只有在j!= prizeDoor && j!= selectDoor 前提下的门才会被加到pool里面
作者: a451629412    时间: 2011-8-8 14:16:43

好高深的题目。。。。。。[害怕]
作者: 灭世大天使    时间: 2011-8-8 14:22:53

我认为 只要有人选了  那么这个门就PASS了 就剩下两个了.................
作者: YXWScan    时间: 2011-8-8 14:26:07

计算机只能产生伪随机数,更优秀的算法只是在尽量高的效率下产生在大范围下近似均匀分布的伪随机序列。
rand()产生的结果在0~32767上是近似均匀分布的,被你mod 3过后在0~2上也是均匀分布的,无论你采用其他任何种算法,都不能在这个小范围上更随机了。
用C++的话,boost下的random库倒是有一票算法可以选,不过还是那句话,没意义,0~2上的随机性这些算法中最差的也能保证。

楼主你的问题在于,对1+1=2这种算术题也要写个程序来证明,而且还是在游戏论坛里对着一票非程序员的玩家,摆出一副寻求探讨的姿态,用的却是不利于沟通的方式,这叫什么,叫装模作样。
这种讨论方式,拿到神马CSDN去,那里新手程序多,会跟你激情碰撞的。为什么说程序新手?放个屁都要写段小程序来验证一下,表示自己会编程,这只能是新人的态度。定理就要用公理来证明,逻辑问题就要逻辑讨论,哪本数学书在推倒的过程中的解释是“这里我写了个小程序,跑了10万个小时都得到这个结果,所以得证”?即使是计算机的算法书,在解释why的时候,也只能用数学来证明。
什么样的场合用什么方式说话,讨论逻辑问题的时候偏要写个蹩脚的三流程序来说明问题,实在是不伦不类。

不是针对楼主本人,是针对这种做法,最近看到几个要写程序“以实事说话”的了,大部分人都看不懂的“实事”,它能够服人吗?
哪怕你们几个新人程序针对这个问题再写一百个程序跑上十天十夜,贴到这个游戏论坛那始终只是哗众取宠,对问题的结论不会有帮助。
我是没有看代码,我认为这种代码不值得看,代码不是用来代替脑子的。
作者: horned    时间: 2011-8-8 14:50:32

本帖最后由 horned 于 2011-8-8 16:09 编辑

回复 乌鸦z 的帖子

不中的話,盡管初始機率不是0,但過程機率的確是0.(就是代表這過程選擇已證實絕對無機會中,不管是過程中別人開中還是你開出不中兩程情況下的那種.)
就像你們之前反對我把3種情況還原成4種情況一樣;
結果我並不是因為這樣證明了1/2,而恰恰相反的還原了6種情況,並解釋證明了2/3以及為甚麼只有3種情況的表述是會令人誤解的.
所以你別因看到別人不合眼的理據就拿來反,搞不好那些理據就是用來印證你自身觀點的正確.




作者: sylecn    时间: 2011-8-8 15:41:52

这个问题竟然扯到伪随机数,真是一群傻蛋。

真正想弄清楚三门问题的去看数学教材或者维基百科
作者: xueyl    时间: 2011-8-8 16:01:15

本帖最后由 xueyl 于 2011-8-8 17:24 编辑

:-) 找到问题了
应该在每次大循环开始的时候给poolSize置一下0
确实是 66%
作者: horned    时间: 2011-8-8 16:27:51

本帖最后由 horned 于 2011-8-8 16:30 编辑

回复 sylecn 的帖子

如果在參考書、百度、維基編寫中文版三門問題解法的人也是這裡的人之一.
你叫他們如何是好?
你是要感謝他們給你參考資料,還是要繼續罵他們傻並因能拿到參考而繼續自豪下去?

作者: Mr.zhao[flying]    时间: 2011-8-8 16:35:25

本帖最后由 Mr.zhao[flying] 于 2011-8-8 16:38 编辑

回复 YXWScan 的帖子

刚才在考虑VB的事情,来晚了。

怎么说呢,最近大家都在讨论这个,我只是想用自己的方式来证明一个命题,参加到这个讨论之中。至于你说这是游戏论坛云云,我看高手也不在少数。

我早说过,不喜勿进。不是来谈论问题的,请你离开。

至于CSDN什么的,不是我这种低端人士去的地方。我只是一个有点编程基础的游戏玩家,哪能跟你这种大神比。

至于用计算机代替人脑进行大量重复试验来逼近理论概率,为何不可以?

作者: horned    时间: 2011-8-8 16:39:21

本帖最后由 horned 于 2011-8-8 16:40 编辑

回复 Mr.zhao[flying] 的帖子

無用的...就算你在標題注明,他們還是會進來看過究竟.
開噴的還是會開噴,討論的還是會討論...
面對天朝的網民,你要適應...

作者: Mr.zhao[flying]    时间: 2011-8-8 16:42:23

回复 horned 的帖子

我正在努力适应……

话说VB的randomize也是用时间产生随机数的,……

作者: horned    时间: 2011-8-8 16:47:21

本帖最后由 horned 于 2011-8-8 16:55 编辑

回复 Mr.zhao[flying] 的帖子

和他們認真,你就輸了~

依靠程序,理論上是無法產生隨機的,因為它只能對一些對象取數.
就算是通過算法產生的,也只是符合算法的結果數組.
看來這會引起"真正的隨機是否存在"的討論.
其實門也是人為放置的,某程度如果由某人制定一個門的排佈表...
再由不知情的人選門,也算是雙隨機...[哇哈哈]
前題是參與者不能在驗證前及過程看到那個表.



作者: Feanor    时间: 2011-8-8 16:57:18

本帖最后由 Feanor 于 2011-8-8 17:00 编辑

我觉得我的lua版的可读性比你的强多了,哈哈哈[哈哈][哈哈]
此外,我是用操作系统时间做随机种子,并事先随机若干次,使得random函数趋于真实。


坛子里写这个模拟的已经3种语言了。无一例外都证明了换门获奖的概率为2/3
不过,一定会有人看也不看一眼的站出来说:你的逻辑本身有问题,所以你的程序模拟的结果也是错误的。而当你洗耳恭听等待他指出你代码的错误时,他就说不出话了……
作者: YXWScan    时间: 2011-8-8 17:00:23

我不吵了,只说事。
那些随机数发生器跟时间函数并没有直接关系,其中线性同余随机数发生器只是需要一个随机种子,需要一个整数来启动序列,数论里面的东西。
srand(1)、srand(2)、srand(3)什么的,一个整数标志一个序列而已,使用时间函数只是为了产生递增的整数避免多次执行程序会产生相同序列,比如你从文件读取一个整数退出时存回文件每次运行递增,有了这个整数完全可以不用时间函数。有些可以SL大法的游戏的存档文件中就存储了这个整数作为随机种子。
作者: Mr.zhao[flying]    时间: 2011-8-8 17:01:11

回复 Feanor 的帖子

您说的太对了……

至于Lua,哈哈,第一时间想起了魔兽插件。好高端的语言啊。

作者: sylecn    时间: 2011-8-8 17:01:29

horned 发表于 2011-8-8 16:27
回复 sylecn 的帖子

如果在參考書、百度、維基編寫中文版三門問題解法的人也是這裡的人之一.

你不懂自己在说什么,也不懂别人在说什么。
我只能说对于一块没有数学头脑和逻辑判断能力的石头,所有推理、证明和语言都失去意义。


作者: YXWScan    时间: 2011-8-8 17:08:27

Feanor 发表于 2011-8-8 16:57
我觉得我的lua版的可读性比你的强多了,哈哈哈
此外,我是用操作系统时间做 ...

其实楼主也用的系统时间作为随机种子

作者: horned    时间: 2011-8-8 17:09:51

本帖最后由 horned 于 2011-8-8 17:14 编辑

回复 sylecn 的帖子

對吖,我現在說的正是你噴人的事實.
你竟然說到石頭裡去了,真是自行印證了:
"你不懂自己在说什么,也不懂别人在说什么。
我只能说对于一块没有数学头脑和逻辑判断能力的石头,所有推理、证明和语言都失去意义。"
這些話.

作者: Mr.zhao[flying]    时间: 2011-8-8 17:09:51

回复 YXWScan 的帖子

因为暂时确实没有更好的办法代替了。

API和随机库什么的太麻烦,懒得弄

作者: YXWScan    时间: 2011-8-8 17:14:03

本帖最后由 YXWScan 于 2011-8-8 17:30 编辑

我刚开始也把3门问题想错了,学你们用代码验证了下,然后再去想弄错的原因。
刚刚我用lua试的。逻辑很简单,我就没太注意命名了,不是给人看的,因为上面也有人贴lua呵呵。

local t = 0
local w = 0
math.randomseed(os.time())
local a = {0, 0, 0}
for _ = 1, 100000 do
    t = t + 1
    a[1], a[2], a[3] = 0, 0, 0
    a[math.random(3)] = 1
    local p = math.random(2) + 1
    if a[p] == 1 then p = 5 - p end
    if a[5 - p] == 1 then w = w + 1 end
end
print(w, t, w / t)

晕,格式排不上去图也贴不上..



作者: 小霸王骑谁    时间: 2011-8-8 17:16:56

高人好多
我小学时有个问题一直无法回答
有高人给解答下么

如果向一个人开枪,多少枪后可以把人打死

我幼儿园的小妹妹说,这个人是打不死的

看大家闲的很

谁要解惑下


作者: 路人L    时间: 2011-8-8 18:20:21

回复 Mr.zhao[flying] 的帖子

可取什么啊,你的程序完全按你的思路写出来的,出来的结果和你自己计算的有差别没?还扯到随机数去了...无语
作者: llwin    时间: 2011-8-8 19:10:30

C#.NET版

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Monty_Hall_problem
{
    class Program
    {
        static Random rnd = new Random();
        static int DoorCount = 3;
        static void Main(string[] args)
        {
            int ChangingWins = 0, ChangingTimes = 0, StayingWins = 0, StayingTimes = 0, AllTimes = 1000000;
            for (int i = 0; i < AllTimes; i++)
            {
                bool Changing = Convert.ToBoolean(rnd.Next() % 2);
                if (Changing)
                {
                    ChangingTimes += 1;
                    if (Simulation(Changing))
                        ChangingWins += 1;
                }
                else
                {
                    StayingTimes += 1;
                    if (Simulation(Changing))
                        StayingWins += 1;
                }
            }
            Console.WriteLine("共模拟{0}次。换门{1}次,赢{2}次;不换门{3}次,赢{4}次", AllTimes, ChangingTimes, ChangingWins, StayingTimes, StayingWins);
            Console.ReadLine();
        }
        static private bool Simulation(bool Changing) //模拟一次游戏过程
        {
            bool[] Door = new bool[DoorCount]; //true表示有车
            for (int i = 0; i < DoorCount; i++)
                Door[i] = false;
            Door[Choose()] = true;
            int Player = Choose();
            int Host = Choose();
            while (Door[Host] || Host == Player) //主持人选择没有车的另一扇门
                Host = Choose();
            if (Changing) //换门
            {
                int i = 0;
                while (i == Player || i == Host) //选择剩下的一扇门
                    i = (i + 1) % DoorCount;
                Player = i;
            }
            return Door[Player];
        }
        static private int Choose() //选择一个门
        {
            return rnd.Next() % DoorCount;
        }
    }
}

运行结果:
共模拟1000000次。换门500262次,赢333737次;不换门499738次,赢166423次

和LZ结论一样

作者: Killerz117    时间: 2011-8-8 19:38:21

DD51 发表于 2011-8-8 12:00
玩过剪刀石头布吗,每次都是胜,平,负各占3分之一,但你应该也遇到过连胜N次,连平N次,连负N次的时 ...

VBS是什么玩意?
作者: Killerz117    时间: 2011-8-8 19:40:53

Mr.zhao[flying] 发表于 2011-8-8 12:57
回复 horned 的帖子

您说的有道理。

API是什么东东?求解
作者: 愤怒的刀疤    时间: 2011-8-8 19:51:54

从主持人在参赛者之后开了一扇门里面是羊开始就已经把情况弄乱了,如果主持人是在参加者之前开那就是1/2
作者: cx87807483    时间: 2011-8-8 19:58:19

娘亲,又开始啦...........                     
作者: 愤怒的刀疤    时间: 2011-8-8 20:00:19

有个和这个题目很相似的题,就是这个题目的简化版  就是在欺诈游戏这部电视里
第2局败者复活战里福永邀请直玩一个游戏
游戏是这样的,有2张扑克一张两面都是背面的图案一张是JOCK和背面的图案。2张扑克放进一个袋子里随机抽
如果抽到JOCK正面就这次游戏无效如果是背面的图案就翻开,翻开之后JOCK就胜利  还是背面的图案就是失败

这个翻开这个动作相当于主持人在参赛者选们之后开一个门。
作者: Mr.zhao[flying]    时间: 2011-8-8 21:34:43

回复 Killerz117 的帖子

http://www.cppblog.com/romangol/archive/2008/04/12/46911.html

这是用windowsAPI产生随机数的一个例子。

至于API,度娘应该会解释的比我好,呵呵

作者: Mr.zhao[flying]    时间: 2011-8-8 21:35:34

回复 Killerz117 的帖子

VBscript.是基于Visual Basic的脚本语言。多用于网页。
作者: qznezzc    时间: 2011-8-8 21:37:32

真高端、、、看不懂啊
作者: 八仙过人    时间: 2011-8-8 21:37:59

三门问题应该有两种:
1.主持人开门的时候必须开空门
2.主持人随机开门,正好遇上空门

你这属于哪种?
这一题最重要的地方其实就是把题目混淆了,逻辑上倒是很简单
作者: Mr.zhao[flying]    时间: 2011-8-8 21:38:23

回复 路人L 的帖子

我说过我只是简化了必然事件的代码,否则我可以写出和上面几位一样的机器逻辑。
这并不是我的思路,而是穷举了所有会发生的情况,明白?

作者: Mr.zhao[flying]    时间: 2011-8-8 21:40:57

回复 八仙过人 的帖子

我在百度里查找的该题目,据其意思看应该是主持人事先知道奖品在哪个门中,然后必然会开一扇空门。
作者: Mr.zhao[flying]    时间: 2011-8-8 21:41:30

回复 llwin 的帖子

C#是好东西,可惜耐不下心来学了……
作者: Bolzmann    时间: 2011-8-9 03:45:38

YXWScan 发表于 2011-8-8 14:26
计算机只能产生伪随机数,更优秀的算法只是在尽量高的效率下产生在大范围下近似均匀分布的伪随机序列。
ran ...

通过大量随机取样来近似真实值,本身也是一种研究的方法,叫做蒙特卡罗(Monte Carlo)仿真,现实中很多无法通过严格数学推导和证明的问题,可以通过这种仿真的方法得到近似的结果
作者: wfhgo    时间: 2011-8-9 06:08:19

这么多人写代码... 哥是不是也该来个Java的...
作者: lattit    时间: 2011-8-9 09:36:20

楼主,我们先不说计算机产生不了真正的随机数,只能产生伪随机数。
只看你这段程序:
-------------------
switch(temp2)
{
case 1:{
  switch(temp1)
  {
  case 1:{bzj++;break;}
  case 2:{zj++;break;}
  case 3:{zj++;break;}
  }
  break;
     }
case 2:{
  switch(temp1)
  {
  case 1:{zj++;break;}
  case 2:{bzj++;break;}
  case 3:{zj++;break;}
  }
  break;
     }
case 3:{
  switch(temp1)
  {
  case 1:{zj++;break;}
  case 2:{zj++;break;}
  case 3:{bzj++;break;}
  }
  break;
     }
}
---------------------
不管 temp1 是什么,temp2取1-3 ,结果都是 zj 能加两次, bzj 加一次。。。,你的程序就决定了zj 是bzj 的两倍,而不是模拟这个问题,明白了么。
作者: xueyl    时间: 2011-8-9 09:43:17

我的代码被忽视了啊。
个人认为我的代码是最简洁的,而且基本上模仿的是游戏过程
作者: Mr.zhao[flying]    时间: 2011-8-9 09:45:46

回复 xueyl 的帖子

不是忽视,您把代码修正好了马上给您放到标题上去。
作者: Mr.zhao[flying]    时间: 2011-8-9 09:46:47

回复 lattit 的帖子

。。。。关于您说的这个事情,我在前面已经解释过两遍了,真的不想解释了。
作者: xueyl    时间: 2011-8-9 09:51:14

回复 Mr.zhao[flying] 的帖子

:-)
不是这个意思,随便吐个槽。
已经改好了,lz可以验证一下。应该比lz用switch写的方法简洁高效吧

作者: lattit    时间: 2011-8-9 09:58:34

Mr.zhao[flying] 发表于 2011-8-9 09:46
回复 lattit 的帖子

。。。。关于您说的这个事情,我在前面已经解释过两遍了,真的不想解释了。 ...

哎,你怎么就不想想是你分析过程就错了呢。
拿一次过程来说,主持人只能选一个门。
玩家有3个选择,主持人有两个选择,一次过程也只有6个选择,还要除掉主持人不能选有奖品的选择。
你的程序呢,是3×3,9种选择,你还坚持吗?

作者: Squallgjs    时间: 2011-8-9 10:09:54

草泥马一群装逼犯,你们那可怜的虚荣心满足完了吗
作者: xueyl    时间: 2011-8-9 10:12:46

回复 Squallgjs 的帖子

恩!
20202020202020

作者: Mr.zhao[flying]    时间: 2011-8-9 10:21:12

回复 lattit 的帖子

哥,Temp2是玩家的选择,一共就三种情况,跟主持人一毛钱的关系都没有……
麻烦你们反驳我之前把代码和题目研究透好吗……

作者: Mr.zhao[flying]    时间: 2011-8-9 10:21:52

回复 xueyl 的帖子

恩,这样倒是。
但是也有人说我这种方法不行,比如说你楼下的……

作者: Mr.zhao[flying]    时间: 2011-8-9 10:24:16

lattit 发表于 2011-8-9 09:58
哎,你怎么就不想想是你分析过程就错了呢。
拿一次过程来说,主持人只能选一个门。
玩家有3个选择,主持 ...

我就算改成一样的判定形式结果也是完全一样的……
只不过我把必然结果的代码省掉了,你要是想看我可以给你加上去行不……

作者: Mr.zhao[flying]    时间: 2011-8-9 10:26:48

回复 lattit 的帖子

况且我的3x3是三个门乘以玩家的三种选择 我真服了
作者: FLZ012    时间: 2011-8-9 10:30:12

真蛋痛 …………
看了四页 关键问题根本不是随机数好不好[害怕]
有人说关键是“主持人知不知道哪个门后有东西”
我只问一个问题
要是主持人开出东西来了 这一例还算不算入统计
作者: Mr.zhao[flying]    时间: 2011-8-9 10:37:59

回复 FLZ012 的帖子

主持人必定会开一个没有奖品的门。主持人事先知道哪个门内有奖品。

题目规定如此。

作者: zeng921206    时间: 2011-8-9 11:02:27

是以这个为借口搞基么!




欢迎光临 游侠NETSHOW论坛 (https://game.ali213.net/) Powered by Discuz! X2