Bonjour,
J'ai le problème suivant dans le cadre d'un programme informatique :
Je désire tester un programme avec en entrée un entier sur un intervalle [0..n] , mais pas de facon séquentielle. Idéalement de facon "la plus aléatoire" possible en apparence, et qui ne sortira pas deux fois le même numéro (donc il deviens invalide a l'index n+1, ou éventuellement est cyclique de période n+1)
J'ai donc essayé de trouver un moyen de créer une bijection de [0..n] vers [0..n] qui répond a cela. Et je m'apercois que ca n'a pas l'air simple ... car les contraintes informatiques me brident (en pratique je vais travailler sur de très grand nombres (128 bits et plus)).
- L'identité ou une symétrie (j = n-i) sont donc exclues (pas assez "aléatoires")
- Je ne peux pas passer directement par un générateur pseudo-aléatoire (a cause du risque de tirer deux fois le même numéro)
- Je ne peux pas faire un système ou je stocke les numéros non tirés et retire celui que j'ai tiré aléatoirement (a cause de l'occupation mémoire qui sera hors de portée)
Le mieux que j'ai réussi a faire c'est de travailler sur Z/nZ avec un nombre premier p > n, je multiplie p par mon index et je fais le modulo n, ca me garanti que tant que je n'ai pas tiré plus de n+1 numéros, je n'aurai pas de doublon. Ce système ne consomme pas de mémoire et est rapide a calculer, mais le résultat n'est pas assez "aléatoire" a mon gout, même si c'est un début.
Il y a donc un problème mathématique avec des contraintes dues a l'implémentation dans un programme informatique (mémoire limité et calcul rapide préférable).
Avez vous des pistes que je pourrai explorer (idées, travaux, lectures) ?
Merci de votre lecture.