Skip to content

Instantly share code, notes, and snippets.

@terakun
Created November 13, 2018 18:06
Show Gist options
  • Save terakun/d9e19ced269b8f677246ddc8c60ad42c to your computer and use it in GitHub Desktop.
Save terakun/d9e19ced269b8f677246ddc8c60ad42c to your computer and use it in GitHub Desktop.
モンテカルロ法で三目並べの勝率計算
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