3 votes

Comment mélanger un tableau de façon déterministe avec une graine ?

Je trouve difficile de mélanger un tableau de façon déterministe, c'est-à-dire avec une graine aléatoire dans Rust. Ce que j'essaie d'obtenir (en pseudo-code) :

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]

Dans une autre réponse de Stack Overflow J'ai appris à utiliser rand::Rng::shuffle() pour mélanger un vecteur de manière non-déterministe, mais il ne semble pas fournir d'API pour appliquer une graine aléatoire à la fonction de génération, et j'ai moi-même du mal à trouver une solution qui n'utilise pas de ridicule n! algorithme de complexité.

6voto

Boiethios Points 8881

Utilisez un générateur de nombres aléatoires qui met en œuvre le trait SeedableRng et appeler from_seed avec la graine désirée.

Exemple :

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]);
}

Clonez le RNG avant de l'utiliser ou créez-en un nouveau à partir de zéro avec la même graine pour revenir à l'état initial.

Vous pouvez également être intéressé par ReseedingRng également.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X