level 1
AB两组球,分别是1-10号,甲从A组随机取一个球,已从B组也取一个,问取到的两个球号码一致的概率是多少?
ps:我本来认为是1/10,心血来潮把这个问题写成小程序。模拟场景1万次,结果运行好几次,都是会发生950次左右的相等事件。
求解
2011年12月08日 08点12分
1
level 7
看什么软件了,一般常见的便宜的软件随机函数并不是很完美, 比如excel就不行。
一般不是专业的人还用不到这么精深
2011年12月08日 20点12分
5
level 1
1/10,理论上同时抽到1的概率1/10乘1/10即1/100,同理同时抽到2,3…到10也都一样是1/100最后10个1/100相加得1/10
2011年12月09日 09点12分
6
level 7
问题出在随机函数并不随机,是固定的,当然几次都一样,100次都一样的!
正确的
方法是历遍,而不是随机,结果就100%正确!
2011年12月10日 06点12分
8
level 10
小兵在说啥?
#include <time.h>
srand ( time(NULL) );
int a = rand()%10;
你说随机函数从数学的意义上讲不是随机的,这点也就罢了。
然而你说”作100次都一样”,那是啥意思?
话要讲清楚,”楼主的随机种子没有设定好”与”随机函数并不随机”是两件事。
2011年12月10日 17点12分
9
level 7
谢谢高手 asmobia 的指教!你说的是对的!我是分析了LZ的实验结果数据都是一样,还都是错的现象做的判断,1:错的原因是随机函数随机性不佳;2:结果都一样的原因是随机函数每次都一样(PS:就是每次都用同一段,而正确的方法应该是每次要用不同段的,就是不同的起点或称不同的种子)
实际上,理想的随机函数是没有的,随机测试是没办法的办法,而本题有最准确的方法的,就是历遍,任何小数据量的概率题都行的。
再次感谢高手指教!上次我们在博弈棋题方面的切磋交流大家都受益良多,希望今后还能为大家奉上新的节目!
2011年12月10日 21点12分
10
level 1
感谢各位,问题出我的随机数获取方法错误了。
方法分析:
Randomize() '创建随机数种子
val = CInt(10*Rnd+0.5) '随机生成1-10中的一个整数
VBS教程随机数(lb,ub)生成公式,其中
ub是上限,
lb是下限,
Rnd是系统随机数(0,1):
(ub-lb)*Rnd+lb,这生成的是一个非整数的数字。
使用CInt可以将整数四舍五入。
误差:但这对于处于边界的值是不公平的,ub的适用范围是(ub-0.5,ub),lb为(lb,lb+0.5)
,他们的获取区间只有0.5,而其他值的获取区间是(mb-0.5,mb+0.5)。
解决方法:将值的生成区间偏移0.5,我们生成随机数范围为CInt((ub-lb)*Rnd+lb+0.5)-1
'-------------以下代码贴到记事本,保存为.vbs即可运行
Dim count
count = 0 '定义相等次数,初始为0次相等
For i=0 To 1000 '执行场景从0次到第10000次(可修改)
Randomize() '创建随机数种子,会生成(0,1)范围的数字
val = CInt(10*Rnd+0.5) '随机生成1-10中的一个整数
val2 = CInt(10*Rnd+0.5) '同上
WScript.Echo i&"-"&Rnd&"-"&val&"--"&val2 '控制台显示生成的随机数和两次选择的球号码
If val= val2 Then
count = count + 1 '计算相等事件的次
End If
Next
MsgBox count '弹出框显示最终的相等事件次数
2011年12月11日 05点12分
11