9

在一个 Rust 项目中,我想根据我在 Java 中习惯的整数种子生成可重现的随机数。

包装箱Seed中的文档说明:rand

种子类型,仅限于可可变解引用为 u8 数组的类型(对于某些 N,我们建议使用 [u8; N])。

这是否意味着整数种子是不可能的?如果可能的话,我如何使用StdRng完整的种子?

4

2 回答 2

10

检查此功能:StdRng::seed_from_u64

它来自实现的SeedableRng特征StdRng

例如:

let mut r = StdRng::seed_from_u64(42);

请注意,只要您在同一平台上使用相同的构建,这将为您提供可重现的随机数,但StdRng不能保证平台和库版本之间的内部实现保持相同!如果平台和构建之间的可重复性对您很重要,那么请查看 crate,例如rand_chacha, rand_pcg, rand_xoshiro.

于 2019-11-24T18:56:49.503 回答
4

我将分享我自己的答案,因为我必须进行更多搜索才能实现我的目标。

货运.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在他的回答中提到的, 请注意,这将保证您(构建 - 平台)上不同运行的相同值,两个月后版本中使用的相同种子可能会给出不同的值。

于 2020-12-04T12:41:49.963 回答