【问题标题】:How to shuffle an array deterministically with a seed?如何用种子确定性地对数组进行洗牌?
【发布时间】:2018-10-11 15:40:30
【问题描述】:

我发现很难确定地洗牌一个数组,在 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]

In another Stack Overflow answer 我学会了如何使用rand::Rng::shuffle() 来不确定地洗牌向量,但它似乎没有提供将随机种子应用于生成函数的 API,我遇到了困难我自己想出了一个解决方案,它不使用一些荒谬的n! 复杂性算法。

【问题讨论】:

    标签: random rust shuffle random-seed


    【解决方案1】:

    使用实现特征SeedableRng 的随机数生成器并使用所需种子调用from_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]);
    }
    

    在使用之前克隆 RNG,或者使用相同的种子从头开始创建一个新的 RNG,以重置回原始状态。

    您可能也对ReseedingRng 感兴趣。

    【讨论】:

    • 完全错过了这个特质,我是个甜甜圈。非常感谢!
    猜你喜欢
    • 2021-12-17
    • 1970-01-01
    • 1970-01-01
    • 2013-01-14
    • 1970-01-01
    • 2021-12-05
    • 2019-12-29
    • 2021-11-28
    • 1970-01-01
    相关资源
    最近更新 更多