|
本帖最后由 天山草 于 2016-10-17 10:06 编辑
我用 VB 语言编写了一个小程序,用产生随机数的方法模拟每次的试验,试验次数累计到 1 亿次,求得概率为 0.74999832(理论概率是0.75)。
程序如下:
Private Sub form_Click()
Randomize '启动随机数发生器
n = 0
For i = 1 To 1000000 ' 试验次数
b1 = 360 * Rnd '产生三个 1 至 360 之间的随机数
b2 = 360 * Rnd
b3 = 360 * Rnd
If b1 <= b2 And b1 <= b3 And b2 <= b3 Then a1 = b2 - b1: a2 = b2 - b3
If b1 <= b3 And b1 <= b2 And b3 <= b2 Then a1 = b3 - b1: a2 = b3 - b2
If b2 <= b1 And b2 <= b3 And b1 <= b3 Then a1 = b1 - b2: a2 = b1 - b3
If b2 <= b3 And b2 <= b1 And b3 <= b1 Then a1 = b3 - b2: a2 = b3 - b1
If b3 <= b1 And b3 <= b2 And b1 <= b2 Then a1 = b1 - b3: a2 = b1 - b2
If b3 <= b2 And b3 <= b1 And b2 <= b1 Then a1 = b2 - b3: a2 = b2 - b1
If a1 <= 180 And -a2 <= 180 And a1 + (-a2) <= 180 Then n = n + 1 '三个点同在半圆内的情况一
If a1 >= 180 And -a2 >= 180 And (360 - a1) + (360 + a2) <= 180 Then n = n + 1 '三个点同在半圆内的情况二
If a1 >= 180 And -a2 <= 180 Then n = n + 1 '三个点同在半圆内的情况三
If a1 <= 180 And -a2 >= 180 Then n = n + 1 '三个点同在半圆内的情况四
Next i
Print "s="; n / (i - 1)
End Sub
说明一下编程思路——
假定这圆周内部是一个圆盘,游戏者每次往盘上投掷三枚飞镖。
从圆盘中心向这三枚飞镖引三条射线,与圆周交于三点。这三点位于同一半圆圆周上的概率即为所求。
每试验一次,程序就产生三个 1 至 360 的随机数 b1,b2,b3,代表三枚飞镖的角度,将这三个角度同步旋转,使中间值角度到达 0 度位置,此时最大角度算是正角度,最小角度算是负角度。程序中将正角度记为 a1,负角度记为 a2,那个中间值角度 a0=0 不必要在程序中出现。
每试验一次,就把三枚飞镖是否落在同一半圆内的次数进行统计,最后算算总账,即得概率。
编程难点是,如何考虑 a0,a1,a2 是位于同一半圆内? 如果对各种情况漏掉或多算,就出错了。我考虑的四种情况是:
(1)如果 a1,a2 都在第一、第二象限中,则 a0,a1,a2 位于同一半圆内;
(2)如果 a1,a2 都在第三、第四象限中,则 a0,a1,a2 位于同一半圆内;
(3)如果 a1 在一、二象限中,而 a2 在三、四象限中,就要计算 a1a0a2 圆弧是否小于半圆,是,则 a0,a1,a2 位于同一半圆内;
(4)如果 a2 在一、二象限中,而 a1 在三、四象限中,就要计算 a1a0a2 圆弧是否小于半圆,是,则 a0,a1,a2 位于同一半圆内。
|
|