计算思路是遍历1到10共10个数的所有组合(用goNext函数),统计出组合总数count与7个数之和等于20的组数successNumber,这两个数的商successNumber/count就是所求的概率。
计算结果为:
总次数: 10000000, 成功次数: 26544, 概率: 0.0026544
程序可以如下实现:
#include <stdio.h>
int data[7]
int goNext()
{
int i
for ( i = 0i <7 &&++data[i] >10++i ) data[i] = 1
if ( i == 7 ) return 0
return 1
}
void main()
{
int i, m
double p
long count = 0, successNumber = 0
for ( i = 0i <7++i) data[i] = 1
do
{
++count
for ( i = 0, m = 0i <7++i ) m += data[i]
if ( 20 == m ) ++ successNumber
} while ( goNext() )
p = (double) successNumber / (double) count
printf("总次数: %d, 成功次数: %d, 概率: %.7lf\n", count, successNumber, p)
}
对哈,你是不放回,还是放回的呀,如果是非放回的是可以算的。假设每次取都是次数与d(n+1)的行数相等,即第n次总是取第n行的球,只要i不停的在d数组中变动,还是能满足楼主的条件的:p=sym(zeros(70,1))
p(1)=1/70
d=sym(zeros(70,1))
d(50)=1
for n=[1:69]
p(n+1)=p(n)+1/(n+1)*[d(n+1)-p(n)]
end
我不知道你算的是什么概率,不过这个概率和不为1,原因很简单,因为
d(n+1)-p(n)很多情况下是负数,所以p(n+1)很多情况下是小于p(n)的,除非取到第i球(我设置i=50,直接写i不能非常难讨论了)时d(n+1)-p(n)才是正值,p(n+1)大于p(n)。
也可能是我理解楼主的问题不到位,忘各位不吝赐教!答案如下: 1/70
1/70
1/140
1/210
1/280
1/350
1/420
1/490
1/560
1/630
1/700
1/770
1/840
1/910
1/980
1/1050
1/1120
1/1190
1/1260
1/1330
1/1400
1/1470
1/1540
1/1610
1/1680
1/1750
1/1820
1/1890
1/1960
1/2030
1/2100
1/2170
1/2240
1/2310
1/2380
1/2450
1/2520
1/2590
1/2660
1/2730
1/2800
1/2870
1/2940
1/3010
1/3080
1/3150
1/3220
1/3290
1/3360
1/3430
71/3500 第五十行
71/3570
71/3640
71/3710
71/3780
71/3850
71/3920
71/3990
71/4060
71/4130
71/4200
71/4270
71/4340
71/4410
71/4480
71/4550
71/4620
71/4690
71/4760
71/4830
71/4900由此可见p(n)=1/n*70(n<i)时,p(n)=71/n*70(n>=i)时
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)