// Draw a random number in range 0 .. number from command line // Repeatedly draw new random number to "guess" the first number. // On each guess remove part of the range // // gtowell. Oct 2023 use std::{env, cmp::Ordering}; use rand::Rng; fn main() { let args: Vec = env::args().collect(); let max_val:u32 = args[1].trim().parse().unwrap(); let val = rand::thread_rng().gen_range(1..=max_val); // thread_rng init a random num generator -- NOT shared between threads. let mut lo = 1; let mut hi = max_val; for z in 0..=((max_val as f64).powf(1.0/4.0) as i32) { // ..= goes to value inclusive, ..goes to value exclusive ... why the fourth root?? Why not! let gg = rand::thread_rng().gen_range(lo..=hi); print!("{} ", z); match gg.cmp(&val) { Ordering::Less => { print!("{gg} is too small"); lo=gg+1; }, Ordering::Greater => { print!("{gg} is too big"); hi=gg-1; }, Ordering::Equal => { println!("{gg} is just right"); return; } } println!(" range {lo}--{hi}"); } }