Ok, c'est une de ces questions plus délicates qu'il n'y paraît, je me tourne donc vers stack overflow parce que je n'arrive pas à trouver une bonne réponse. Voici ce que je veux : J'ai besoin de Python pour générer une simple liste de nombres de 0 à 1.000.000.000 dans un ordre aléatoire à utiliser pour les numéros de série (en utilisant un nombre aléatoire de sorte que vous ne pouvez pas dire combien ont été attribués ou faire des attaques de synchronisation aussi facilement, c'est-à-dire deviner le prochain qui va venir). Ces numéros sont stockés dans une table de base de données (indexée) avec les informations qui leur sont liées. Le programme qui les génère ne s'exécute pas éternellement et ne peut donc pas se fier à son état interne.
Ce n'est pas un gros problème, n'est-ce pas ? Il suffit de générer une liste de nombres, de les placer dans un tableau et d'utiliser Python "random.shuffle(big_number_array)" et le tour est joué. Le problème est que j'aimerais éviter d'avoir à stocker une liste de nombres (et donc de lire le fichier, d'en extraire un, de sauvegarder le fichier et de le fermer). Je préfère les générer à la volée. Le problème est que les solutions auxquelles je pense posent des problèmes :
1) Générer un numéro aléatoire et ensuite vérifier s'il a déjà été utilisé. S'il a été utilisé, générer un nouveau nombre, vérifier, répéter si nécessaire jusqu'à ce que je trouve un nombre inutilisé. Le problème ici est que je peux être malchanceux et générer un grand nombre de numéros utilisés avant d'en trouver un qui n'est pas utilisé. Solution possible : utiliser un très grand nombre de numéros pour réduire les risques (mais je me retrouve alors avec des numéros longs et stupides).
2) Générer un numéro aléatoire et ensuite vérifier s'il a déjà été utilisé. S'il a été utilisé, ajoutez ou soustrayez un au nombre et vérifiez à nouveau, répétez jusqu'à ce que je trouve un nombre inutilisé. Le problème est que ce n'est plus un nombre aléatoire car j'ai introduit un biais (je finirai par obtenir des groupes de nombres et vous serez en mesure de prédire le prochain nombre avec une meilleure chance de succès).
3) Générer un numéro aléatoire et vérifier ensuite s'il a déjà été utilisé. S'il a été utilisé, ajoutez ou soustrayez un autre nombre aléatoire généré et vérifiez à nouveau. Le problème est que nous revenons à la génération de nombres aléatoires et à la vérification comme dans la solution 1.
4) Se résigner à générer une liste aléatoire et la sauvegarder, demander à un démon de les mettre dans une file d'attente pour qu'il y ait des numéros disponibles (et éviter d'ouvrir et de fermer constamment un fichier, en le mettant en lot à la place).
5) Générer des nombres aléatoires beaucoup plus grands et les hacher (c'est-à-dire en utilisant MD5) pour obtenir une valeur numérique plus petite, nous devrions rarement avoir des collisions, mais je me retrouve à nouveau avec des nombres plus grands que nécessaire.
6) Ajoutez des informations temporelles au nombre aléatoire (par exemple, l'horodatage Unix) afin de réduire les risques de collision.
Quelqu'un a-t-il des idées astucieuses pour réduire les risques de "collision" (c'est-à-dire générer un numéro aléatoire qui est déjà pris) mais aussi pour me permettre de garder un nombre "petit" (c'est-à-dire inférieur à un milliard (ou mille millions pour vos Européens =)).
Réponse et pourquoi je l'ai acceptée :
Si c'est le cas, j'opterai pour la solution déterministe consistant à générer tous les nombres et à les stocker de manière à garantir l'obtention d'un nouveau nombre aléatoire, et je pourrai utiliser de "petits" nombres (c'est-à-dire 9 chiffres au lieu d'un MD5/etc.).