该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
五子棋随便下下出平局的概率
现在请你们设想:有两个人下五子棋,每一着的位置都随机。
问:这样子正好打出和棋(填满棋盘,仍无五子连珠)的概率是多少?
棋盘是19乘19的,六子连珠不算赢。
大家猜猜看概率是多少。
公布答案。
概率几乎为0!
我用Visual Basic设计了一个小程序,用循环无限枚举法测试,结果,到现在我的计算机一共进行了2497,8780盘五子棋,没有一盘是平局的!在最厉害的一盘中,电脑填满了360个格点(19*19=361),在还剩一个格点填满棋盘时,黑方胜利了!
在这2497,8780盘五子棋中,先手方获胜1261,1928盘,胜率达50.498%。
这证明:先手还是有优势的!
现在,让我们来考虑一下五子棋局一共有多少种情况。棋盘一共361个格电,于是第一着就有361种情况。紧接着第二招又有360种情况,第三招359……根据乘法原理,五子棋局的情况总量高达361!(361的阶乘)。
那么,361!具体是多大呢?
首先说一下阶乘的运算方法。
361!=361×360×359×358×357×……×3×2×1
好的,那么我们发现,361!至少有260个三位数相乘。我们又知道,一个数每乘上一个三位数,这个数的位数至少上升二位(36×100=3600,745×100=74500,因数大于100的就更不用说了)
意思就是说,361! 应该至少是一个520位数!!!!
所以361!远远大于1×10^520。
如果你的中学老师叫你算概率应该用树状图,那么你可以去试试看。
好吧,这很明显是不可能的。可是不用怕,有高科技帮我们!
经过我的不懈努力,我设计出的程序能够在1毫秒(1/1000秒)内枚举出127盘五子棋。
假设我把我的电脑打开、一直运行我的程序,一年之后会发生什么呢?
一年有31536000秒,于是一年之内我的程序就可以枚举出31536000000盘棋局。可是上面说过了,五子棋局一共有至少10^520种情况!
我们拿10^520去除以31536000000,得到的结果约是3.4*10^509。
差不多相当于“3”后面跟509个“0”。
所以,我的程序到一年之后也不会算完所有其情况——还差3400000000000……00000000年哩!
现在我们假设有一台外星科技计算机,它的处理速度极高,以毫秒内能计算1000000000000000000000000000000000000000000000000000000000000000盘五子棋。
经过计算,我发现,就算使用这样的计算机,要枚举完所有的棋局情况,也得等上个100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000年才能完成!
所以,不要指望有人能枚举出五子棋所有棋局情况。
好好好,我们不枚举。我们随机抽选。只要随机抽选出足够的棋局情况,就一定能找到平局情况!
所以我就设计了这个程序:
Dim LianXu As Integer
Dim p(0 To 18, 0 To 18) As Integer
Dim Won As Boolean, Pingju As Boolean
Dim Black As Long, Tie As Long, Zong As Long, QiZi As Integer
Dim AVqizi As Double, MaxQizi As Integer
Private Sub 棋(Side As Integer)
QiZi = QiZi + 1
If QiZi > 19 * 19 Then
Timer2.Interval = 1000
Pingju = True
Exit Sub
End If
Dim x As Integer, y As Integer
SuiJi: x = Int(Rnd() * 19)
y = Int(Rnd() * 19)
If p(x, y) <> 0 Then
GoTo SuiJi
Else
p(x, y) = Side
End If
'''''''''''''''''''''''''''''''''''''''''
Dim x2 As Integer, y2 As Integer
Dim Hori As Integer, Vert As Integer, cc As Integer, dd As Integer
x2 = x
y2 = y
Hor1: x2 = x2 + 1
If x2 > 18 Then '
x2 = x
y2 = y
GoTo Hor2
End If
If p(x2, y2) = Side Then
Hori = Hori + 1
GoTo Hor1
End If
x2 = x
y2 = y
Hor2: x2 = x2 - 1
If x2 < 0 Then '
x2 = x
y2 = y
GoTo Ver1
End If
If p(x2, y2) = Side Then
Hori = Hori + 1
GoTo Hor2
End If
x2 = x
y2 = y
Ver1: y2 = y2 + 1
If y2 > 18 Then '
x2 = x
y2 = y
GoTo Ver2
End If
If p(x2, y2) = Side Then
Vert = Vert + 1
GoTo Ver1
End If
x2 = x
y2 = y
Ver2: y2 = y2 - 1
If y2 < 0 Then '
x2 = x
y2 = y
GoTo cc1
End If
If p(x2, y2) = Side Then
Vert = Vert + 1
GoTo Ver2
End If
x2 = x
y2 = y
cc1: x2 = x2 + 1: y2 = y2 + 1
If x2 > 18 Or y2 > 18 Then '
x2 = x
y2 = y
GoTo cc2
End If
If p(x2, y2) = Side Then
cc = cc + 1
GoTo cc1
End If
x2 = x
y2 = y
cc2: x2 = x2 - 1: y2 = y2 - 1
If x2 < 0 Or y2 < 0 Then '
x2 = x
y2 = y
GoTo dd1
End If
If p(x2, y2) = Side Then
cc = cc + 1
GoTo cc2
End If
x2 = x
y2 = y
dd1: x2 = x2 - 1: y2 = y2 + 1
If x2 < 0 Or y2 > 18 Then '
x2 = x
y2 = y
GoTo dd2
End If
If p(x2, y2) = Side Then
dd = dd + 1
GoTo dd1
End If
x2 = x
y2 = y
dd2: x2 = x2 + 1: y2 = y2 - 1
If x2 > 18 Or y2 < 0 Then '
x2 = x
y2 = y
GoTo Chk
End If
If p(x2, y2) = Side Then
dd = dd + 1
GoTo dd2
End If
Chk: If cc = 5 Or Hori = 5 Or Vert = 5 Or dd = 5 Then
Won = True
End If
End Sub
Private Sub Command1_Click()
If Timer1.Interval = 0 Then
AI "已继续运算..."
Timer1.Interval = 1
Form1.BackColor = &H8000000F
Else
Timer1.Interval = 0
AI "运算已暂停。"
Form1.BackColor = RGB(0, 50, 80)
End If
Call Timer3_Timer
End Sub
Private Sub Timer1_Timer()
For r = 1 To 255
Zong = Zong + 1
For q = 1 To 2 Step 0
棋 2
If Won = True Then
Black = Black + 1
Exit For
End If
If Pingju = True Then
Tie = Tie + 1
Exit For
End If
棋 1
If Won = True Then
Exit For
End If
If Pingju = True Then
Tie = Tie + 1
Timer1.Interval = 0
Exit Sub
Exit For
End If
Next q
If QiZi - 1 > MaxQizi Then MaxQizi = QiZi - 1
AVqizi = (AVqizi * (Zong - 1) + QiZi - 1) / Zong
Won = False '清空棋盘
Pingju = False '
QiZi = 0 '
For i = 0 To 18 '
For j = 0 To 18 '
p(i, j) = 0 '
Next j '
Next i '''''''''
Next r
End Sub
Private Sub Timer2_Timer()
Beep
End Sub
Private Sub Timer3_Timer()
Label7 = AVqizi
Label8 = MaxQizi
Label1 = Black / Zong * 100
Label2 = Tie
Label5 = Zong
Label6 = Black
If Timer1.Interval = 1 Then AI "正在运算中,一切正常..."
End Sub
Private Sub Timer4_Timer()
If Timer1.Interval = 1 Then
LianXu = LianXu + 1
Else
LianXu = 0
End If
If LianXu > 12 Then
AI "为了控制CPU温度,运算自动暂停。10秒后恢复运算。"
LianXu = 0
Timer1.Interval = 0
Timer5.Interval = 10000
End If
End Sub
Private Sub Timer5_Timer()
AI "运算已恢复。"
Timer1.Interval = 1
Timer5.Interval = 0
End Sub
Private Sub AI(Text As String)
Text2.Text = Text & Chr(13) & Chr(10) & Text2.Text
End Sub
一切就绪,开始运行。
视频来自:土豆
很久很久以后……2497,8780盘五子棋被枚举。
没有一盘平局!
好吧,如果哪个网友能够计算出 随机下五子棋 平局的概率,我将感激不尽!!!
---END---