rust - 有没有办法将随机数生成器存储为特征对象?
问题描述
有没有办法在 Rust 中保存一个通用的随机数生成器?我想要一种编写通用代码的方法,例如:
use rand::Rng; // 0.7.2
fn main() {
// Purely random numbers on the interval 0 to 1
println!("Pure random");
let mut rng: Box<dyn rand::Rng> = Box::new(rand::thread_rng());
for i in 0..10 {
println!("{}", rng.gen::<f64>());
}
println!("");
// On a seed
*rng = rand::SeedableRng::seed_from_u64(0);
for i in 0..10 {
println!("{}", rng.gen::<f64>());
}
println!("");
}
该变量rng
使用种子或其他方式保存不同类型的随机数生成器。但是,此代码存在大量错误,例如:
error[E0038]: the trait `rand::Rng` cannot be made into an object
--> src/main.rs:6:18
|
6 | let mut rng: Box<dyn rand::Rng> = Box::new(rand::thread_rng());
| ^^^^^^^^^^^^^^^^^^ the trait `rand::Rng` cannot be made into an object
|
= note: method `gen` has generic type parameters
= note: method `gen_range` has generic type parameters
= note: method `sample` has generic type parameters
= note: method `fill` has generic type parameters
= note: method `try_fill` has generic type parameters
因此,持有随机数生成器以便可以用另一个替换它的正确方法是什么?基本上,我想生成纯随机数,然后用种子替换生成器以进行调试。
解决方案
您想RngCore
用于您的 trait 对象,而不是Rng
:
use rand::{Rng, RngCore, SeedableRng}; // 0.7.2
use rand_chacha::ChaCha20Rng; // 0.2.1
fn main() {
let mut rng: Box<dyn RngCore>;
rng = Box::new(rand::thread_rng());
for _ in 0..10 {
println!("{}", rng.gen::<f64>());
}
println!();
rng = Box::new(ChaCha20Rng::seed_from_u64(42));
for _ in 0..10 {
println!("{}", rng.gen::<f64>());
}
}
也可以看看:
其他要点
rand::SeedableRng::seed_from_u64
没有任何意义,因为您从未指定具体类型来实现 trait 对象。纯随机数
两个生成器都是伪随机数生成器,并产生相同类型的数字;一个并不比另一个“更随机”。
推荐阅读
- bluetooth - 如何在不拔下 USB/重新启动的情况下在 Linux 上重置蓝牙适配器?
- python - 在 Dropbox Python API v2 中下载文件时遇到问题
- excel - 删除“联合”非连续范围
- api - 将 Canvas LMS API 调用中的 \N 替换为 NULL
- sql - SQL:连接两个时间序列数据并计算给定时间点的总数和比率
- c++ - 多级继承中的 CRTP derived() 方法
- javascript - 在节点js中将html表数据插入mysql数据库
- html - 仅 CSS 手风琴布局
- javascript - Javascript 为什么标头脚本中的对象属性可以,但在 html 中未定义?
- react-native - 如何在 Connect 组件下的 graphql 查询中使用 $filter 变量?