3x3의 ○×게임(세째 줄)의 모든 사건
15747 단어 mathJuliaJupyter-notebook
소개
peing의 사이트에 『3×3의 ○×게임의 전사상은 몇 가지 있을까요』라고 질문이 왔습니다. 재미있을 것 같아서 생각해보기로 했습니다.
거친
선수를 ○, 후수를 ×로 한다. 9개의 송어
1 2 3
4 5 6
7 8 9
에 ○×○×○×○×○를 순서에 넣어 가는 것 생각합니다.
그렇다면,
$$9!=362880\text{(거리)}$$
됩니다.
예 1
1
3
6
4
7
5
9
2
8
○
×
○
×
○
×
○
×
○
케이스는
에서 9회째로 선수의 승리가 됩니다.
예 2
1
3
5
4
9
6
7
2
8
○
×
○
×
○
×
○
×
○
케이스는
에서 5번째로 선수의 승리가 됩니다. 보통 6번째부터 9번째는 하지 않습니다.
6번째부터 9번째를 변경해도, 5번째로 선수의 승리인 것은 변하지 않으므로,
5번째까지 끝나면 예 1의 경우보다 $4!=24$배의 가중치가 있게 됩니다.
본격적으로 세는!
우선, 각각 게임이 끝나는 횟수별로 나눕니다.
선수를 ○, 후수를 ×로 한다. 9개의 송어
1 2 3
4 5 6
7 8 9
에 ○×○×○×○×○를 순서에 넣어 가는 것 생각합니다.
그렇다면,
$$9!=362880\text{(거리)}$$
됩니다.
예 1
1
3
6
4
7
5
9
2
8
○
×
○
×
○
×
○
×
○
케이스는
에서 9회째로 선수의 승리가 됩니다.
예 2
1
3
5
4
9
6
7
2
8
○
×
○
×
○
×
○
×
○
케이스는
에서 5번째로 선수의 승리가 됩니다. 보통 6번째부터 9번째는 하지 않습니다.
6번째부터 9번째를 변경해도, 5번째로 선수의 승리인 것은 변하지 않으므로,
5번째까지 끝나면 예 1의 경우보다 $4!=24$배의 가중치가 있게 됩니다.
본격적으로 세는!
우선, 각각 게임이 끝나는 횟수별로 나눕니다.
5 손목, 7 손목, 9 손목
6 손목, 8 손목
9 손목
입니다. 이 6 패턴으로 경우의 수를 계산합니다.
코딩
3x3game.jlfunction eva(X)
a,b,c,d,e,f,g,h,i=X[1],X[2],X[3],X[4],X[5],X[6],X[7],X[8],X[9]
abs(a+b+c)==3 || abs(d+e+f)==3 || abs(g+h+i)==3 || abs(a+d+g)==3 || abs(b+e+h)==3 || abs(c+f+i)==3 || abs(a+e+i)==3 || abs(c+e+g)==3
end
using Combinatorics
X=[1,2,3,4,5,6,7,8,9]
Y=collect(permutations(X))
Z=[]
for i=1:length(Y)
A=Y[i]
B=[0,0,0,0,0,0,0,0,0]
for k in [1,3]
B[A[k]]=1
B[A[k+1]]=-1
end
B[A[5]]=1
if eva(B)
append!(Z,5)
continue
end
B[A[6]]=-1
if eva(B)
append!(Z,6)
continue
end
B[A[7]]=1
if eva(B)
append!(Z,7)
continue
end
B[A[8]]=-1
if eva(B)
append!(Z,8)
continue
end
B[A[9]]=1
if eva(B)
append!(Z,9)
else append!(Z,10)
end
end
println("5手目で先手が勝つのは",Int(count(Z.==5)/24),"通り")
println("6手目で後手が勝つのは",Int(count(Z.==6)/6),"通り")
println("7手目で先手が勝つのは",Int(count(Z.==7)/2),"通り")
println("8手目で後手が勝つのは",count(Z.==8),"通り")
println("9手目で先手が勝つのは",count(Z.==9),"通り")
println("9手目で引き分けとなるのは",count(Z.==10),"通り")
println("先手の勝つ確率は",(count(Z.==5)+count(Z.==7)+count(Z.==9))/factorial(9))
println("後手の勝つ確率は",(count(Z.==6)+count(Z.==8))/factorial(9))
println("引き分けの確率は",(count(Z.==10))/factorial(9))
# 결과
5번째로 선수가 이기는 것은 1440거리
6번째로 후수가 이기는 것은 5328거리
7번째로 선수가 이기는 것은 47952 거리
8번째로 후수가 이기는 것은 72576거리
9번째로 선수가 이기는 것은 81792 거리
9손목으로 무승부가 되는 것은 46080거리
선수가 이길 확률은 0.584920634920635
후수의 이길 확률은 0.28809523809523807
무승부 확률은 0.12698412698412698
모든 사건의 수는
$$1440+5328+47952+72576+81792+46080=255168\text{(거리)}$$
입니다.
가중치가 다르므로 확률을 구할 때는 주의입니다. 가중치를 고려하면,
$$1440\times24+5328\times6+47952\times2+72576+81792+46080=362880=9!\text{(거리)}$$
됩니다.
선수가 이길 확률은
$$\frac{1440\times 24+47952\times2+81792}{362880}=0.584920634920635$$
후수의 이길 확률은
$$\frac{5328\times 6+72576}{362880}=0.28809523809523807$$
무승부 확률은
$$\frac{46080}{362880}=0.12698412698412698$$
전략적으로 진행하면
확률은 구해졌습니다만, 실제로는 게임은 선수·후수가 반드시 지지 않도록 전략적으로 배치할 수 있기 때문에, 잘 하면, 계속 무승부가 계속됩니다.
○와 ×를 쓰는 장소를 되돌리지 않는 형태의 복권으로 결정해 나가면, 각각의 확률은 전술과 같이 됩니다.
<참고>
https://ko.wikipedia.org/wiki/삼목 정렬
Reference
이 문제에 관하여(3x3의 ○×게임(세째 줄)의 모든 사건), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/dannchu/items/3a8951c776120a373162
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
function eva(X)
a,b,c,d,e,f,g,h,i=X[1],X[2],X[3],X[4],X[5],X[6],X[7],X[8],X[9]
abs(a+b+c)==3 || abs(d+e+f)==3 || abs(g+h+i)==3 || abs(a+d+g)==3 || abs(b+e+h)==3 || abs(c+f+i)==3 || abs(a+e+i)==3 || abs(c+e+g)==3
end
using Combinatorics
X=[1,2,3,4,5,6,7,8,9]
Y=collect(permutations(X))
Z=[]
for i=1:length(Y)
A=Y[i]
B=[0,0,0,0,0,0,0,0,0]
for k in [1,3]
B[A[k]]=1
B[A[k+1]]=-1
end
B[A[5]]=1
if eva(B)
append!(Z,5)
continue
end
B[A[6]]=-1
if eva(B)
append!(Z,6)
continue
end
B[A[7]]=1
if eva(B)
append!(Z,7)
continue
end
B[A[8]]=-1
if eva(B)
append!(Z,8)
continue
end
B[A[9]]=1
if eva(B)
append!(Z,9)
else append!(Z,10)
end
end
println("5手目で先手が勝つのは",Int(count(Z.==5)/24),"通り")
println("6手目で後手が勝つのは",Int(count(Z.==6)/6),"通り")
println("7手目で先手が勝つのは",Int(count(Z.==7)/2),"通り")
println("8手目で後手が勝つのは",count(Z.==8),"通り")
println("9手目で先手が勝つのは",count(Z.==9),"通り")
println("9手目で引き分けとなるのは",count(Z.==10),"通り")
println("先手の勝つ確率は",(count(Z.==5)+count(Z.==7)+count(Z.==9))/factorial(9))
println("後手の勝つ確率は",(count(Z.==6)+count(Z.==8))/factorial(9))
println("引き分けの確率は",(count(Z.==10))/factorial(9))
확률은 구해졌습니다만, 실제로는 게임은 선수·후수가 반드시 지지 않도록 전략적으로 배치할 수 있기 때문에, 잘 하면, 계속 무승부가 계속됩니다.
○와 ×를 쓰는 장소를 되돌리지 않는 형태의 복권으로 결정해 나가면, 각각의 확률은 전술과 같이 됩니다.
<참고>
https://ko.wikipedia.org/wiki/삼목 정렬
Reference
이 문제에 관하여(3x3의 ○×게임(세째 줄)의 모든 사건), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/dannchu/items/3a8951c776120a373162텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)