random - 如何在不引入偏差的情况下生成一个范围内的随机 Rust 整数?
问题描述
我如何在 Rust 中生成随机骰子?
我知道我可以使用rand::random
,但这需要我想生成一个整数类型的值。使用rand::random<u8>() % 6
引入了偏差。
解决方案
用于Rng::gen_range
一次性值:
use rand::{self, Rng}; // 0.8.0
fn main() {
let mut rng = rand::thread_rng();
let die = rng.gen_range(1..=6);
println!("The die was: {}", die);
}
在引擎盖下,这创建了一个Uniform
结构。如果您将获得多个随机数,请自行创建此结构:
use rand::{
self,
distributions::{Distribution, Uniform},
}; // 0.8.0
fn main() {
let mut rng = rand::thread_rng();
let die_range = Uniform::new_inclusive(1, 6);
let die = die_range.sample(&mut rng);
println!("{}", die);
}
Uniform
做一些预计算来弄清楚如何在不引入偏差的情况下将随机值的完整范围映射到您想要的范围。它转换并调整原始范围的大小以最接近随机数生成器的范围,丢弃任何超出此新范围的随机数,然后调整大小并转换回原始范围。
也可以看看:
推荐阅读
- python - 根据 DataFrame 中的过滤条件将正值转换为负值
- r - 是否可以在 R 中进行动态绑定?
- neo4j - neo4j - 密码查询以查找属性与对象参数匹配的节点
- javascript - 打字稿从外部源返回数据对象
- android - 如何将回调/流返回给调用者线程?
- java - BottomNavigationMenu 中的圆形菜单项
- python - Python - 列表中 O(n^2) 跳转次数的复杂性
- c# - 重新开始新游戏时,我应该如何将整个世界的所有对象重置为原始状态?
- java - java.lang.ClassCastException:java.util.ArrayList 无法转换为 Produccion
- java - 空对象引用上的“java.lang.String android.content.Context.getPackageName()”