@你看上去很欧


假设TheMax = 10,TheMin = 1,TheCount = 3
第一个数字被抽中的概率为3/10
第二个数字被抽中的概率为3/10*2/9+7/10*3/9= 3/10
其中,2/9和3/9为公式(TheCount - List1.ListCount) / (TheMax - i + 1)在每一种情况下求得的概率,证得第二个数由公式求得的概率与预期3/10一致,公式正确
第三个数字被抽中的概率为3/10*2/9*1/8
+3
/10*7/9*2/8+7/10*3/9*2/8+7/10*6/9*3/8=3/10
其中,1/8、2/8、2/8和3/8为公式(TheCount - List1.ListCount) / (TheMax - i + 1)在每一种情况下求得的概率,证得第三个数由公式求得的概率与预期3/10一致,公式正确
。。。。。。以此类推
这个公式是没问题的,至于楼主的其他问题,我稍微加两行代码来满足就行了:
Dim TheMax As Integer
Dim TheMin As Integer
Dim TheCount As Integer
TheMax = 100
TheMin = 0
TheCount = 50
Cls
List1.Clear
Randomize
Dim TheRnd As Double
For i = TheMin To TheMax
If Rnd() < (TheCount - List1.ListCount) / (TheMax - i + 1) Then
If TheCount = List1.ListCount + 1 Then
Text1.Text = i: Text2.Text = Int(Rnd * (List1.ListCount + 1) + 1)
List1.AddItem i, (Val(Text2.Text) - 1)
Else
List1.AddItem i, Int(Rnd * (List1.ListCount + 1))
End If
End If
Next
For i = 0 To TheCount
Print List1.List(i) & " ";
If i Mod 10 = 9 Then Print
Next
我实际测试的运算速度,在不考虑输出与输出顺序的情况下,也就是直接把值传递给下一过程,仅作为中间过程使用。抽了2楼的洗牌、7楼位图和我的概率
2楼的洗牌+抽牌运算速度在各种参数下速度最快
7楼在抽取数量较少时运算速度较快,但还是没2楼快
我的概率算法和7楼相反,但远大于2楼的用时
测试结果是2楼的抽牌速度在各种参数下最强(别杠抽一两张牌的时候)