JAVA中计算五子棋平局的算法_五子棋随便下下出平局的概率

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

五子棋随便下下出平局的概率

现在请你们设想:有两个人下五子棋,每一着的位置都随机。

问:这样子正好打出和棋(填满棋盘,仍无五子连珠)的概率是多少?

棋盘是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---

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值