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

使用const_random生成常量随机数始终重复,如何解决?

问题原因

const_random!是编译期随机数生成宏,它生成的常量值在编译阶段就被固定,程序运行期间不会改变,所以每次调用get_number()都会返回同一个值。

解决方案

根据你的需求选择以下两种方案:

方案一:运行时生成动态随机数(常用场景)

如果需要每次运行程序都得到不同的随机数,放弃const_random,改用标准库的rand crate:

  1. 添加依赖到Cargo.toml:
[dependencies]
rand = "0.8"
  1. 修改代码:
pub mod random_id {
    use rand::Rng;

    pub fn get_number() -> u64 {
        rand::thread_rng().gen()
    }
}

每次调用get_number()都会生成全新的随机u64值。

方案二:编译期每次生成不同值(特殊场景)

如果必须在编译期生成随机数,但希望每次编译程序时数值不同,可结合const_random_seed!和构建脚本自动生成种子:

  1. 添加依赖到Cargo.toml:
[dependencies]
const_random = "0.1"

[build-dependencies]
rand = "0.8"
  1. 在项目根目录创建build.rs脚本:
use rand::Rng;
use std::env;

fn main() {
    let seed = rand::thread_rng().gen::<u64>();
    println!("cargo:rustc-env=RANDOM_SEED={seed}");
}
  1. 修改src/lib.rs代码:
use const_random::const_random_seed;

// 读取构建时生成的随机种子
const SEED: u64 = env!("RANDOM_SEED").parse().unwrap();

pub mod random_id {
    use super::SEED;
    use const_random::const_random_seed;

    const NUMBER: u64 = const_random_seed!(u64, SEED);

    pub fn get_number() -> u64 {
        NUMBER
    }
}

每次执行cargo build时,构建脚本会生成新的随机种子,编译后的程序中NUMBER会是全新的编译期随机值。

内容的提问来源于stack exchange,提问作者porton1111

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 09:42:46