测试猜拳的胜率

测试猜拳的胜率

测试猜拳的胜率

Oct 11, 2025 • windqyoung

use rand::Rng;

use rand::prelude::ThreadRng;

use std::cmp::Ordering;

#[derive(PartialEq, Copy, Clone, Debug)]

enum Guess {

石头,

剪刀,

布,

}

impl PartialOrd for Guess {

fn partial_cmp(&self, other: &Self) -> Option {

match (self, other) {

(Guess::石头, Guess::剪刀) | (Guess::剪刀, Guess::布) | (Guess::布, Guess::石头) => {

Some(Ordering::Greater)

}

(Guess::石头, Guess::布) | (Guess::剪刀, Guess::石头) | (Guess::布, Guess::剪刀) => {

Some(Ordering::Less)

}

(Guess::石头, Guess::石头) | (Guess::剪刀, Guess::剪刀) | (Guess::布, Guess::布) => {

Some(Ordering::Equal)

}

}

}

}

fn gen_guess(last: Option, rand: &mut ThreadRng) -> Guess {

use crate::Guess::{剪刀, 布, 石头};

match last {

None => {

let all = vec![剪刀, 石头, 布];

rand_one(all, rand)

}

Some(guess) => match guess {

石头 => {

let all = vec![剪刀, 布];

rand_one(all, rand)

}

剪刀 => {

let all = vec![石头, 布];

rand_one(all, rand)

}

布 => {

let all = vec![剪刀, 石头];

rand_one(all, rand)

}

},

}

}

fn rand_one(all: Vec, rand: &mut ThreadRng) -> Guess {

let idx = rand.random::() as usize % all.len();

let item = all[idx];

item

}

fn go() {

let mut rand = rand::rng();

let mut last = None;

let count = 1_000_000;

let mut a_win = 0;

let mut b_win = 0;

println!("A角色随机, B根据A上次出手结果在剩下的里面选择");

for i in 0..count {

// println!("last: {last:?}");

let a = gen_guess(None, &mut rand);

let b = gen_guess(last, &mut rand);

if a > b {

a_win += 1;

} else if b > a {

b_win += 1;

}

last = Some(a);

}

println!("结果: A win: {}, {}, B win: {}, {}, Total: {}", a_win, a_win as f64/count as f64, b_win, b_win as f64/count as f64, count);

}

fn main() {

println!("Hello, world!");

go();

}

结果

A角色随机, B根据A上次出手结果在剩下的里面选择

结果: A win: 333115, 0.333115, B win: 332966, 0.332966, Total: 1000000

上一篇: rust try练习

下一篇: 在Echarts地图坐标系中设置底图

相关数据