如何用种子确定性地洗牌数组?
How to shuffle an array deterministically with a 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]
In another Stack Overflow answer I learnt how to use rand::Rng::shuffle()
不确定地打乱向量,但它似乎没有提供 API 用于将随机种子应用于生成函数,我遇到了困难我自己想出了一个解决方案,没有使用一些荒谬的 n!
复杂度算法。
使用随机数生成器实现具有所需种子的特征 SeedableRng
and call 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 或使用相同的种子从头开始创建一个新的以重置回原始状态。
您可能也对 ReseedingRng
感兴趣。
我发现很难确定性地打乱数组,即 在 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 I learnt how to use rand::Rng::shuffle()
不确定地打乱向量,但它似乎没有提供 API 用于将随机种子应用于生成函数,我遇到了困难我自己想出了一个解决方案,没有使用一些荒谬的 n!
复杂度算法。
使用随机数生成器实现具有所需种子的特征 SeedableRng
and call 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 或使用相同的种子从头开始创建一个新的以重置回原始状态。
您可能也对 ReseedingRng
感兴趣。