如何用种子确定性地改组数组?

jon*_*nny 3 random shuffle rust random-seed

我发现很难确定性地改组数组,在Rust中使用随机种子.我想要实现的目标(伪代码):

let v = vec![0, 1, 2, 3];
pseudo_shuffle(v, randomSeed1) // always produces e.g. [3,1,2,0]
pseudo_shuffle(v, randomSeed2) // always produces e.g. [0,2,3,1]
Run Code Online (Sandbox Code Playgroud)

在另一个Stack Overflow答案中,我学会了如何使用rand::Rng::shuffle()非确定性地对向量进行混洗,但它似乎没有提供用于将随机种子应用于生成函数的API,并且我很难想出一个解决方案我自己没有采用一些荒谬的n!复杂算法.

Fre*_*ios 6

使用实现特征的生成器SeedableRngfrom_seed使用所需的种子调用.

例:

use rand::{seq::SliceRandom, SeedableRng}; // 0.6.5
use rand_chacha::ChaChaRng; // 0.1.1

fn main() {
    let seed = [0; 32];
    let mut rng = ChaChaRng::from_seed(seed);

    let mut v1 = vec![1, 2, 3, 4, 5];
    v1.shuffle(&mut rng);
    assert_eq!(v1, [3, 5, 2, 4, 1]);
}
Run Code Online (Sandbox Code Playgroud)