使用const_random生成常量随机数始终重复,如何解决?
问题原因
const_random!是编译期随机数生成宏,它生成的常量值在编译阶段就被固定,程序运行期间不会改变,所以每次调用get_number()都会返回同一个值。
解决方案
根据你的需求选择以下两种方案:
方案一:运行时生成动态随机数(常用场景)
如果需要每次运行程序都得到不同的随机数,放弃const_random,改用标准库的rand crate:
- 添加依赖到
Cargo.toml:
[dependencies] rand = "0.8"
- 修改代码:
pub mod random_id { use rand::Rng; pub fn get_number() -> u64 { rand::thread_rng().gen() } }
每次调用get_number()都会生成全新的随机u64值。
方案二:编译期每次生成不同值(特殊场景)
如果必须在编译期生成随机数,但希望每次编译程序时数值不同,可结合const_random_seed!和构建脚本自动生成种子:
- 添加依赖到
Cargo.toml:
[dependencies] const_random = "0.1" [build-dependencies] rand = "0.8"
- 在项目根目录创建
build.rs脚本:
use rand::Rng; use std::env; fn main() { let seed = rand::thread_rng().gen::<u64>(); println!("cargo:rustc-env=RANDOM_SEED={seed}"); }
- 修改
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
相关产品推荐
相关产品推荐

