概率模拟华中科技大学概率统计系副主任王湘君, 哪里错了1

发信人: cutepig (聪明猪), 信区: Python

标 题: 概率模拟:华中科技大学概率统计系副主任王湘君, 哪里错了?

发信站: 水木社区 (Fri Jul 31 21:40:09 2009), 转信

大家帮我看看哪里写错了, 我写的测试程序计算出来概率几乎为0了

http://www.newsmth.net/bbstcon.php?board=NewExpress&gid=11062084&start=11062084&pno=1

发信人: FullHouse (醉读女人心), 信区: NewExpress

标 题: 华中科技大学概率统计系副主任王湘君

发信站: 水木社区 (Fri Jul 31 08:41:47 2009), 站内

1138户中选514户,514户中出现14人连号,这种现象出现的概率有多大?

记者就此连线了华中科技大学概率统计系副主任王湘君。

经半小时核算,王湘君说概率为1.4%。

我的思路跟下面说的一样

发信人: rainarch (尘纹), 信区: NewExpress

标 题: Re: 华中科技大学概率统计系副主任王湘君

发信站: 水木社区 (Fri Jul 31 10:20:47 2009), 站内

我算不出来,用程序模拟一下,具体如下:

  1. 每次用随机数对1138选514

  2. 每回合摇号摇100,000次,统计出现14连号以上,也就是包含14+的次数。

  3. 总共3回合。

结果如下

   14+次数

回合1:815

回合2:841

回合3:811

合计+:2467

也就是说命中率 0.82%

这个不是完全意义上的统计概率。

附源代码:

import random , os

def GenAndCheck(n,m,same):

data=[]

#gen m number

for i in range(m):

	data.append(int(random.random()*n))



#check

data.sort()

for i in range(m-same):

	if data[i+same-1] - data[i]==same-1:

		return True;

return False

if 1:

okNum=0



n=1138

m=514

same=14

loop=100000

for i in range(loop):

	if GenAndCheck(n,m,same):

		okNum += 1

	if (1+i)%100==0:

		print i+1, okNum

print "result is" ,1.0 * okNum/loop

发信人: shell (func_code), 信区: MathTools

标 题: 1138选514的Python的数值模拟

发信站: 水木社区 (Fri Jul 31 20:08:51 2009), 站内

只考虑了14连号情况,如果大于14,例如15连号、16连号……则不算。

from future import division

import random

import time

from itertools import groupby

from operator import itemgetter

def tossup():

content = xrange(1138)

data = sorted(random.sample(content, 514))

length = max(len(map(itemgetter(1), g)) for k, g in

          groupby(enumerate(data),lambda (i,x):i-x))

if length >= 14:

    return 1

else:

    return 0

def main():

total = 0

valid = 0

step = 100000

while True:

    total += step

    valid += sum(tossup() for _ in xrange(step))

    print total, valid/total, time.ctime()

if name == “main”:

main()

算出来,结果大约是0.455左右。直接求解不会求,晕啊。

发信人: shift (负债累累), 信区: NewExpress

标 题: Re: 华中科技大学概率统计系副主任王湘君

发信站: 水木社区 (Fri Jul 31 09:19:52 2009), 站内

嗯,我也是这么算的

【 在 mchd (hot) 的大作中提到: 】

(c500 1124 * 1125)/(c514 1138)

发信人: shift (负债累累), 信区: NewExpress

标 题: Re: 华中科技大学概率统计系副主任王湘君

发信站: 水木社区 (Fri Jul 31 09:31:02 2009), 站内

从n个数里面选m个,至少有k个连号的情况是:

(n-k+1)C(n-k,m-k)/C(n,m)

至少k+1个连号

(n-k)C(n-k-1,m-k-1)/C(n,m)

刚好k连号

上面式子相减

发信人: mcx (aaa), 信区: NewExpress

标 题: RE这个Re: 华中科技大学概率统计系副主任王湘君

发信站: 水木社区 (Fri Jul 31 11:11:14 2009), 站内

我估算了一下,就只考虑14连号的情况,1138选514的可能种数是是C(1138,514),简单地认为14连号的情况一种有1125种,即:1~14,2~15,…,1125~1138。这样的话,14连号剩下的1124个选500个就是C(1125,500),由于 C(n,m)=n!/(n-m)!/m!

算概率就是C(1125,500)*1125/C(1138,514)

实际上,14连号的情况比C(1125,500)*1125要少,因为有15连号等情况在这里考虑时有重复,需要去除,但估算概率的话,15连号等重复情况肯定是比较少,情况的总个数应该在这个数量级上

用matlab算这个:

5015025035045055065075085095105115125135141125/1138/1137/1136/1135/1134/1133/1132/1131/1130/1129/1128/1127/1126/1125

=0.015

大概是1.5%的概率,然后去除一些小量的重复情况,概率是1%的数量级应该是差不多的。

Powered by Jekyll and Theme by solid

本站总访问量