Created
November 13, 2018 18:06
-
-
Save terakun/d9e19ced269b8f677246ddc8c60ad42c to your computer and use it in GitHub Desktop.
モンテカルロ法で三目並べの勝率計算
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
extern crate rand; | |
use rand::{thread_rng, Rng}; | |
fn end(board: &Vec<i32>) -> usize { | |
// 縦 | |
for i in 0..3 { | |
let mut sum = 0; | |
for j in 0..3 { | |
sum = sum + board[i * 3 + j]; | |
} | |
if sum == 3 { | |
return 0; | |
} else if sum == -3 { | |
return 1; | |
} | |
} | |
for j in 0..3 { | |
let mut sum = 0; | |
for i in 0..3 { | |
sum = sum + board[i * 3 + j]; | |
} | |
if sum == 3 { | |
return 0; | |
} else if sum == -3 { | |
return 1; | |
} | |
} | |
let mut sum = 0; | |
for i in 0..3 { | |
sum = sum + board[i * 3 + i]; | |
} | |
if sum == 3 { | |
return 0; | |
} else if sum == -3 { | |
return 1; | |
} | |
let mut sum = 0; | |
for i in 0..3 { | |
sum = sum + board[i * 3 + (2 - i)]; | |
} | |
if sum == 3 { | |
return 0; | |
} else if sum == -3 { | |
return 1; | |
} | |
2 | |
} | |
fn check(v: &Vec<usize>) -> usize { | |
let mut board: Vec<i32> = vec![0; 9]; | |
let mut c = 1; | |
for i in v { | |
board[*i] = c; | |
c = -c; | |
let idx = end(&board); | |
if idx < 2 { | |
return idx; | |
} | |
} | |
end(&board) | |
} | |
fn main() { | |
let mut v: Vec<usize> = (0..9).collect(); | |
let mut count = vec![0; 3]; | |
let mut rng = thread_rng(); | |
let n = 10000000; | |
for _ in 0..n { | |
rng.shuffle(&mut v); | |
let idx = check(&v); | |
count[idx] = count[idx] + 1; | |
} | |
println!("{:?}", count); | |
let se: Vec<f64> = count | |
.iter() | |
.map(|c| { | |
let p = (*c as f64) / (n as f64); | |
(p * (1.0 - p) / (n as f64)).sqrt() | |
}) | |
.collect(); | |
println!("{:?}", se); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment