当前位置:文档之家› 在excel中产生随机数

在excel中产生随机数

用excel产生随机数
统计软件提供的随机数发生器可以使我们对抽样分布进行计算机模拟,对抽样分布有更加直观的理解。

Excel的分析工具库中有一个“随机数发生器”模块,可以产生服从大部分常用分布的模拟数据,但没有提供直接产生随机数的函数。

在SPSS中产生随机数的函数在“Randomnumbers”类别中,相应的函数都是以Rv 开头的。

1 样本均值抽样分布的随机模拟
假总体的均值为μ,标准差为σ,则统计理论表明,不论总体的分布如何,只要样本容量n足够大,样本均值的分布总会趋向于正态分布,且均值为μ,标
准差为。

例题:假设总体为均匀分布,模拟样本均值的抽样分布。

假设总体的分布为0-1区间上的均匀分布,则总体的均值为0.5,方差等于
1/12,标准差等于0.288675。

现在,我们从总体中抽取1000个样本容量为2的样本(有放回抽样),计算每个样本的样本均值,然后观察样本均值的分布状况。

新建一个Excel工作簿,单击“工具”“数据分析”“随机数发生器”,在弹出的对话框中把变量个数设为2,随机数个数为1000,选择0-1区间的均匀分布,结果放在新工作表中(图1)。

把输出结果的每一行看作一个容量为2的样本,共有1000个样本。

在C列中计算每个样本的均值。

接下来我们就可以分析这1000个样本均值的分布状况了。

由于SPSS的直方图工具更为方便,我们把相应的数据复制到SPSS中作直方图,结果如图2,抽样分布的均值为0.5097,标准差为
0.20345,理论值等于0.288675/ 2 =0.20412,两者差异不大。

图1 随机数发生器对话框
图2 样本均值的抽样分布,样本容量=2
2 样本比例抽样分布的随机模拟
样本比例实质上就是指标数值只能取0和1时的样本均值。

由于在这种情况下总体的分布为0-1分布,因此在重复抽样的条件下样本均值抽样分布的理论分布是二项分布。

中心极限定理表明当样本用量足够大(能够保证np≥5,nq≥5)时二项分布可以用正态分布来近似。

[例] 假设有大批零件,不合格率p为0.2。

随机模拟从总体中抽取样本容量分别为5,20,50的2000个样本,分析样本比例pˆ 的抽样分布。

新建一个工作表,在单元格中输入图5-10左上角所示的信息作为总体:总体中取值为1(不合格)的概率为0.2,取值为0(合格)的概率为0.8。

图3 二项分布的随机模拟
使用Excel的随机数发生器,在分布中选择“离散”,数值与概率区域选为$A$1:$B$2,变量个数设为5,随机数设为2000(图3)。

在输出数据中,把每一行看作一个随机样本,计算样本比例(均值)。

在SPSS中作样本比例抽样分布的直方图,如图4。

图4 样本比例的抽样分布,样本容量=5
这是百度知道一位同学的提问。

要求生成范围为1到50的随机整数,并且,1-15的机率为50%,16-36的机率为30%,37-50的机率为20%。

同时还要求生成500组,每组8个。

我当时给出一个公式:
=if(rand()<0.5,round(rand()*14,0)+1,if(rand()<0.6,round(rand()*20,0)+ 16,round(rand()*13,0)+37))
这里说下用round和用int的区别,用int生成16-36的随机数的话应该用int(rand()*21+16),而用round可用round(rand()*20+16),这后面的+16放括号里面外面都一样,因为取整操作是由小数部分决定的。

还有我第二个if的判断用的是rand()<0.6而不是小于0.3,这是因为第二个if 会执行的机率是50%,50%乘以0.6就是30%。

后来楼主同学又出怪招,要求每组无重复数字,每组从小到大排列。

这个只用单纯的公式的话不好办了。

我写了个VBA:
Sub madeRnd()
Dim i, j, k, a(8), flag, t
Sheets("Sheet1").Select
For k = 1 To 500
'生成一组随机数字
For i = 1 To 8
flag = 0
Do
Randomize
t = Rnd()
If t < 0.5 Then
a(i) = Int(Rnd() * 15 + 1) ElseIf t < 0.8 Then
a(i) = Int(Rnd() * 21 + 16) Else
a(i) = Int(Rnd() * 14 + 37) End If
If i >= 2 Then
For j = 1 To i - 1
If a(i) = a(j) Then
flag = 1
Exit For
Else
flag = 0
End If
Next j
End If
Loop While flag = 1
Next i
'给随机数排序
For i = 7 To 1 Step -1
For j = 1 To i
If a(j) > a(j + 1) Then
a(0) = a(j)
a(j) = a(j + 1)
a(j + 1) = a(0)
End If
Next j
Next i
'输出一组随机数字
For i = 1 To 8
Cells(k, i) = a(i)
Next i
Next k
End Sub
很奇怪,我在表格上用公式写了个机率统计,就是统计这8*500个单元格的数据分布。

发现我开始用公式生成的机率很正常,非常接近50%,30%,20%这个比例,波动不超过1%。

而用VBA生成的数据,机率就有点偏,总是在48%,31%,21%这样子。

我不得不调整一下,如把VBA里面的判断条件t<0.5稍微改下,改成
t<0.5+0.0175这样子。

稍微调高1-15出现的机率。

这是什么原因?难道是VBA的rnd()函数没有EXCEL表格函数的rand()公正?
可以谢幕了吗?no!!there is no little case in the world.||||||
怪同学又来了,再次提出无理要求,要求可以方便的随意更改数字范围。

这。

只能用上传说中的人机交互接口了。

其实就是个窗体啦。

这里贴张图片。

这个从上面的VBA改一改就可以了。

(修改:对了,我后来才发现,我的排序居然没起作用。

原来排序的语句我写成for i = 7 to 1,汗,高一时学的basic,
早忘得差不多了,这里应该改成for i = 7 to 1 step -1,我上面的VBA代码已经改好了。

这个排序正确的图片就不再重发了。


最后再提一点,回答问题的可不止我一个,有一位“小色”兄弟,也是写的VBA。

我看了下他的,跟我的思路不一样,他的可是绝对的50:30:20的比例。

他的方法大概是这样的:从8乘500的单元格里,随意抽取一个单元格,如果单元格为空,就往里面填数据。

抽取2000次填1-15的随机数,抽取1200次填16-36的随机数,抽取800次填37-50的随机数。

我的思路?就跟我那个VBA一样的,生成一个随机数,根据它的取值来决定生成哪个区间的整数。

最后还有一位神级大哥,他的方法已经是大道天成,已经达到了手中无剑,心中有剑,万物皆可为剑的至高境界。

方法很简单,我直接复制他的过来:
1.首先
工具-加载宏,勾选分析工具库.
勾选后,工具菜单下出现"数据分析"菜单
2.在A1:A50输入序列1-50
B1:B15输入=0.5/50
B16:B36输入=0.3/21
B37:B50输入=0.2/14
3.工具-数据分析,随机数字发生器.
变量个数:8
随机数个数:500
分布:离散
数值与概率输入区域:A1:B50
输出新工作表组,默认不改即可.
确定.
从小到大排序显示:
I1输入公式:
=SMALL($A1:$H1,COLUMN(A1))
向右拖动填充公式到P1,
然后选中I1:P1
向下拖动到P500
这个,EXCEL真强大。

相关主题