二分查找猜测次数的数学公式与实验结果不符问题求助
二分查找猜测次数的数学公式与实验结果不符问题求助
我最近写了一个用二分查找在指定范围内猜数字的小程序,目前测试下来代码运行没啥问题。但当我想推导一个能预测平均猜测次数的数学公式时,遇到了困惑——我直觉上觉得公式应该是 log₂(x) + 1,但用大数(比如1e12)做实验的时候,结果却更接近 log₂(x) - 1。我现在也不确定自己的公式到底对不对,所以想求助大家帮忙看看问题出在哪,下面是我的完整代码,麻烦帮忙检查下计算逻辑有没有问题:
use rand::Rng; use std::io; use std::cmp::Ordering; use std::time::Instant; fn read_input() -> i64 { println!("Insert the range of the number [1 - <input>]: "); let mut max_range_str = String::new(); io::stdin() .read_line(&mut max_range_str) .expect("Failed to read line"); let max_range: i64 = max_range_str.trim().parse().expect("Please type a number!"); max_range } fn binary_search_guess(target: i64, max_range: i64) -> u32 { let mut min = 1; let mut max = max_range; let mut guess_count = 0; loop { guess_count += 1; let guess = (min + max) / 2; match guess.cmp(&target) { Ordering::Less => min = guess + 1, Ordering::Greater => max = guess - 1, Ordering::Equal => break, } } guess_count } fn main() { let max_range = read_input(); let mut rng = rand::thread_rng(); let mut total_guesses = 0; let iterations = 1000000; let start = Instant::now(); for _ in 0..iterations { let target = rng.gen_range(1..=max_range); total_guesses += binary_search_guess(target, max_range); } let avg_guesses = total_guesses as f64 / iterations as f64; let log2_x = (max_range as f64).log2(); println!("Average guesses: {:.2}", avg_guesses); println!("log2(x): {:.2}", log2_x); println!("log2(x)+1: {:.2}", log2_x + 1.0); println!("log2(x)-1: {:.2}", log2_x - 1.0); println!("Time elapsed: {:?}", start.elapsed()); }
我自己也在琢磨,是不是公式本身的推导有问题?或者代码里二分查找的实现细节(比如边界处理、猜测次数的计数方式)影响了平均结果?麻烦各位帮忙分析下~
备注:内容来源于stack exchange,提问作者Perseus_Lynx
相关产品推荐
相关产品推荐

