如何在Rust中使用rand crate生成随机数时输入整数种子?

13
在Rust项目中,我想基于整数种子生成可重复的随机数,就像在Java中一样。rand箱中Seed的文档说明:种子类型被限制为可变解引用为u8数组的类型(我们建议使用[u8; N],其中N是某个数字)。这是否意味着整数种子不可能?如果可能,如何使用StdRng和整数种子?

为什么相同“种子”应生成相同的数字,Rust有自己的实现,Java也有。 - Stargateur
2个回答

16

检查这个函数:StdRng::seed_from_u64

它来自于SeedableRng特质,StdRng实现了它。

例如:

let mut r = StdRng::seed_from_u64(42);
请注意,只要您在同一平台上使用相同的构建版本,这将为您提供可重现的随机数字,但是StdRng的内部实现不能保证在不同平台和库版本之间保持不变! 如果跨平台和构建之间的可重复性对您很重要,请查看诸如rand_chacharand_pcgrand_xoshiro等货箱。

6

我将分享我的答案,因为我不得不再搜索一些信息才能实现我的目标。

Cargo.toml

[dependencies]
rand = "0.7.3"
rand_distr = "0.3.0"

代码:

use rand_distr::{Normal, Distribution};
use rand::{Rng,SeedableRng};
use rand::rngs::StdRng;

fn main() {

    let mut r = StdRng::seed_from_u64(222); // <- Here we set the seed
    let normal = Normal::new(15.0, 5.0).unwrap(); //<- I needed Normal Standard distribution

    let v1 = normal.sample(&mut r); // <- Here we use the generator
    let v2 = normal.sample(&mut r);
    let n1: u8 = r.gen();   // <- Here we use the generator as uniform distribution
    let n2: u16 = r.gen();
    println!("Normal Sample1: {}", v1);
    println!("Normal Sample2: {}", v2);
    println!("Random u8: {}", n1);
    println!("Random u16: {}", n2);
}

我的输出:

Normal Sample1: 12.75371699717887
Normal Sample2: 10.82577389791956
Random u8: 194
Random u16: 7290

正如michaelsrb在他的答案中提到的那样,请注意这将确保在您的(构建-平台)上的不同运行中具有相同的值,两个月后版本中使用的相同种子可能会给出不同的值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接