三目並べをランダムに指したときの先手の勝利確率は?

作成日: 2022-10-05
このツイートを見かけて、オッズを求めてみた。
勝率は先手58%、後手29%、引き分け17%。 (計算間違いが判明したので訂正)
オッズでは先手はおよそ3to5(1.72)、後手は3to10(3.45)、引き分けは3to17(5.88)でした。
win={0=>0, 1=>0, -1=>0}
t=0
[*0..8].permutation do |moves|
    board = [0] * 9
    player = 1
    [*moves, nil].each do |move|
        if move == nil
            win[0] += 1
            break
        end
        board[move] = player
        lines = [[0,1,2],[3,4,5],[6,7,8],[0,3,6],[1,4,7],[2,5,8],[0,4,8],[2,4,6]]
        if lines.any?{|line| line.all?{|i| board[i] == player} }
          win[player] += 1
          ok = true
          if t < 10
              print board.map{|a|"X.O"[a+1]}.each_slice(3).map{|a|a.join("")}.join("\n")+"\n\n"
              t +=1
          end
          break
        end
        player *= -1
    end
end
puts win
s  =  win[-1]+win[0]+win[1]
puts win.map{|k,v|[k,1.0*v/s]}.to_h