You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

二分查找猜测次数的数学公式与实验结果不符问题求助

二分查找猜测次数的数学公式与实验结果不符问题求助

我最近写了一个用二分查找在指定范围内猜数字的小程序,目前测试下来代码运行没啥问题。但当我想推导一个能预测平均猜测次数的数学公式时,遇到了困惑——我直觉上觉得公式应该是 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.17 11:25:28