Question

J'ai besoin d'un algorithme qui me donne des numéros entiers avec les fonctionnalités suivantes:

  • Les numéros doivent être dans une plage donnée $ [n..m] $;

  • Les nombres doivent être renvoyés dans l'ordre pseudo-aléatoire (aléatoire à l'inspection visuelle est suffisant; il est plus important que les nombres soient bien distribués sur la plage donnée);

  • Les numéros ne peuvent pas se répéter avant que chaque numéro de la plage $ [n..m] $ ait été retourné une fois;

  • La gamme peut être énorme (jusqu'à 2 $ ^ {64} $; cela exclut tous les algorithmes basés sur la liste / shuffle);

  • Il devrait être possible de semer la fonction afin qu'il renvoie des nombres dans un ordre différent sur répétition;

  • L'algorithme doit être aussi rapide que possible et doit revenir en temps constant.

J'ai écrit du code qui utilise l'échange de bits basé sur une table et éventuellement XOR et / ou l'ajout. Cela fonctionne très bien pour les $ N $ et $ M $. Cependant, c'est un peu lent et si la gamme $ n..m $ n'est pas alignée sur les bits (c'est-à-dire $ n $ autre que 2 ^ x $ et $ m $ autre que 2 ^ y $), j'obtiens l'une ou l'autre des lacunes à l'intérieur Les chiffres renvoyés ou le comportement d'exécution extrêmement non constant.

Comment cela peut-il être résolu?

Pas de solution correcte

Licencié sous: CC-BY-SA avec attribution
Non affilié à cs.stackexchange
scroll top