Is there a way to store a random number generator as a trait object?
有没有办法在Rust中保存通用随机数生成器? 我想要一种编写通用代码段的方法,例如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | 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!(""); } |
变量
1 2 3 4 5 6 7 8 9 10 11 | 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 |
这样,持有一个随机数生成器以便可以被另一个替换的正确方法是什么? 基本上,我想生成纯随机数,但是出于调试目的,请使用种子将生成器替换为一个随机数。
您想将
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | 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对象的具体类型。 -
Purely random numbers
这两个生成器都是伪随机数生成器,它们产生相同类型的数字。 一个不会比另一个"随机"得多。