会编程的大神们帮帮忙吧!C语言或excel里的宏、VBA等等什么的都可以,只要能解决我这个问题的就行

某盒子里有M个球[每个球代表一个不同的数值],现要在该盒子中随机抽球,每次抽取一个球并记下球上的数值,然后将抽出的球放回盒子中继续抽球,一共抽取N次,然后将以上抽取的N个数值求出平均值X[不同N个数值的平均值X有可能是相等的],现需得出不同的X出现的概率,最后结果最好是能导出到EXCEL里
【具体M、N可以是11个数抽3个数、11抽5、13抽3、13抽5】

打开一个Excel表,按ALT+F11进入VBE窗口,在左上方的工程-VBAProject那里的sheet1上双击一下,在右边的空白区域输入下列代码:
Sub aa()
M = Val(InputBox("请输入放入球的数量", "提示"))
N = Val(InputBox("请输入放入抽取的次数", "提示"))
Randomize
kk = 1
Const MM = 100 '开关,控制抽取的次数,这里的100表示抽取100次,如果要抽10000次,将100改成10000即可
Cells(kk, 1) = "X"
Cells(kk, 2) = "次数"
Cells(kk, 3) = "概率"
For i = 1 To MM
k = 0
x = 0
For j = 1 To N '抽取N次
k = Int(Rnd() * (M - 1)) + 1
x = x + k
Next j
x = x / N '取得N次的平均值X
tmp = x
Set c = Range("A:A").Find(tmp, LookIn:=xlValues, lookat:=xlWhole)
If c Is Nothing Then
j = 0
kk = kk + 1
Cells(kk, 1) = tmp
Cells(kk, 2) = 1
Cells(kk, 3) = Cells(kk, 2) / MM '相对总次数的概率
Else
Cells(c.Row, 2) = Cells(c.Row, 2) + 1
Cells(c.Row, 3) = Cells(c.Row, 2).Value / MM
End If
Next
End Sub
然后关闭VBE,回到Excel界面,按ALT+F8,选择sheet1.aa执行即可看到结果。追问

这里每个球都代表一个数值,然后抽N次,你这个好像不太对吧

追答

k = Int(Rnd() * (M - 1)) + 1
这里表示抽球的动作。
For j = 1 To N '抽取N次
k = Int(Rnd() * (M - 1)) + 1
x = x + k
Next j
这表示抽N个球,X表示平均值。
这里只能取得一个X,你是需要不同的X的概率,所以只能用电脑模拟100次即MM列出来X出现的概率,MM越大,x的概率越接近。

温馨提示:内容为网友见解,仅供参考
第1个回答  2012-05-05
随机抽取会有重复出现的问题,你所说的概率应该是指所有的组合裏面平均数相同的概率吧?追问

是所有种可能出现的平均值X里每个X出现的概率

追答

还有个问题,给定的M数组的值,不固定吗?应为不一样的值,它的平均值肯定不一样么,这样算出来的X值应该也是不同的吧?

追问

给定的M数组的值是固定的,就是给你M个数,然后在里面选5个数,比如给定一组数[1、2、3、4、5、6、7],从中选3个数,可能是[1、3、5][2、2、5][3、3、3],这3组数的平均值就是相等的

追答

M数组是顺序结构对吧?而且从1开始?这个数组总得固定的,应为如果我随便给个其他的[9、6、4、7、8、1、3]又或者其他很大的数值,这样一来,你这个平均数X就没有意义了,所以才问你是否是固定值。
具体给你个思路,1.任取n个时,每个只能取1次。即不能出现111,22这样的组合。2.无序是指单纯的组合。即可能出现123和132和321。
具体公式网网上找找。找出所有组合之後,将每个组合的数组单元只和相加,存入一个新的数组(和相等,平均数就相等)a[m]。设置一个新的参数k=0。然後循环比对数组中每一个值在数组中出现的次数,有相同值时,参数累加1,循环结束后将a[0]/n的值和k/m的值存入新的数组b[x]={a[0]/n,k/m}则b[0]的值就是你第一个平均数a[0]/n与它的概率k/m,然後在循环依次存入a[0]~a[m]的值与他们的概率就好
最後在将数组b[x]的值导入到EXCEL中就能达到你的要求了

第2个回答  2012-05-05
无能为力啊
相似回答