Как перетасовать массив с помощью семени? - PullRequest
0 голосов
/ 01 мая 2018

Мне трудно детерминировать перемешивание массива, , т.е. со случайным начальным числом в 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]

В другом ответе о переполнении стека Я узнал, как использовать rand::Rng::shuffle(), чтобы перетасовать вектор недетерминированным образом, но, похоже, он не предоставляет API для применения случайного Начать с функции генерации, и мне трудно найти решение, которое не использует какой-то нелепый алгоритм сложности n!.

1 Ответ

0 голосов
/ 01 мая 2018

Используйте генератор случайных чисел, который реализует черту 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]);
}

Клонируйте ГСЧ перед его использованием или создайте новый с нуля с тем же семенем, чтобы вернуть его в исходное состояние.

Вас также может заинтересовать ReseedingRng.

...