web-dev-qa-db-fra.com

Y a-t-il un générateur de nombre pseudo-aléatoire assez simple à faire dans votre tête?

Existe-t-il des générateurs de nombres pseudo-aléatoires qui sont assez faciles à faire avec l'arithmétique mentale, ou l'arithmétique mentale plus compter sur vos doigts. Évidemment, cela se limite à des mathématiques assez simples - cela doit être quelque chose que peut faire une personne ayant une capacité mathématique moyenne, ou peut-être une capacité moyenne pour un programmeur, pas un prodige en mathématiques.

Le plus simple que j'ai trouvé est la méthode Carré du milieu , mais non seulement on sait qu'elle est une source médiocre de caractère aléatoire, mais elle semble encore trop complexe pour être complétée sans crayon et papier.

Si la seule façon de le faire est de limiter la plage, comme si cela ne pouvait peut-être que produire des nombres de 8 bits, c'est très bien. Je soupçonne qu'un des algorithmes standard PRNG serait assez simple dans une version 8 bits, mais je ne connais pas assez pour en simplifier aucun, de la version 32 bits à une version 8 bits. (Tous ceux que j'ai examinés dépendent de numéros de semences spécialement sélectionnés, qui diffèrent en fonction du nombre de bits que vous utilisez, et en général, seuls des exemples 32 et 64 bits sont donnés.)

25
LeBleu

Un registre à décalage à retour linéaire } est assez simple, tant que vous êtes à l'aise pour penser en binaire (ou peut-être en hexadécimal, car il est facile de mapper entre les deux).

Un plus complexe est Xorshift , mais si vous connaissez vos opérations au niveau des bits, il devrait être tout à fait possible de travailler avec.

15
Michael Madsen

Pseudo-aléatoire ( selon Dilbert ):

Dilbert Cartoon of 2001-10-25

40
Margus

Dans votre tête, vous pouvez faire une génération "sémantique" de nombres aléatoires :-)

Comme pour prendre Word au hasard et en calculer une métrique, répétez l'opération jusqu'à ce que vous obteniez un nombre de D'une longueur raisonnable.

Par exemple, le mot "exercice" peut être converti en 10100101b (vous pouvez voir mon idée de conversion ici).

4
BarsMonster

Qu'en est-il de Blum Blum Shub, mais avec des nombres premiers trop petits pour une utilisation sécurisée? Utilisé de manière sécurisée, il est lent, mais cela implique des opérations auxquelles nous sommes habitués. Vous pourrez donc atteindre une vitesse raisonnable sans trop de pratique, peut-être avec M = 437 ou un peu plus grand.

De toute façon, je doute que tout ce que je pourrais faire dans ma tête soit sécurisé. Je ne me souviens tout simplement pas d'assez grands nombres pour pouvoir travailler sans erreurs dans un État de taille raisonnable.

Vous pouvez facilement faire un LFSR 10 bits sur vos doigts, si vous avez des tendons décents ;-)

Pas une réponse directe, mais en fonction de la raison de votre question, vous pourriez être intéressé par Solitaire , qui génère un flux de clés (c'est-à-dire une séquence pseudo-aléatoire) à l'aide d'un jeu de cartes. Ne peut pas être fait dans votre tête, mais ne nécessite pas de crayon et de papier.

3
Steve Jessop

C'est assez basique et devrait tenir dans la tête de la plupart des gens:

  1. Commencez avec un numéro de graine à trois chiffres (trouver une graine appropriée peut être un problème plus difficile).
  2. Multipliez-le par neuf.
  3. Séparez le quatrième chiffre des trois derniers chiffres et additionnez les deux chiffres pour obtenir un nouveau nombre à trois chiffres.
  4. Notez ces chiffres. Pour aider à dissimuler le motif, vous pouvez écrire un ou deux chiffres seulement.
  5. Répétez les étapes 2 à 4 si nécessaire.

Tant que vous ne commencez pas avec zéro, cela va parcourir une période de 4500 résultats. La sortie ne "semble" pas aléatoire, mais elle est en décimale et même les vrais résultats aléatoires ne paraissent pas aléatoires, ce qui explique pourquoi les humains craignent cette tâche.

Je pourrais essayer de pirater un programme pour le convertir en binaire de manière impartiale pour le tester.

Configurations alternatives:

  • trois chiffres et multiplier par 3
  • quatre chiffres et multiplier par 6
  • cinq chiffres et multiplier par 2
2
sh1

Oui, j'en connais un qui peut éventuellement être fait dans votre tête, et si vous le modifiez plus avant, des nombres vraiment aléatoires prennent une liste de nombres, une liste ordonnée de nombres en base dix, qui serait la plus facile à calculer. Ajoutez-les ensemble, ne gardez que le numéro de position du chiffre résultant, puis placez-le à la fin de la liste et déposez le premier chiffre, puis répétez l'opération: cela ne produira pas de vrais nombres aléatoires, mais suffisamment aléatoire et dépendant du La taille de la liste de nombres que vous choisissez d'utiliser finira par se répéter, mais pour une liste initiale volumineuse, elle ne sera pas répétée suffisamment longtemps.

par exemple, si je n'ai utilisé que 5 chiffres dans une liste 12345, la liste suivante serait 2345 et le chiffre le plus à droite, 1 + 2 + 3 + 4 + 5ie 15 ou 5, de sorte que la liste serait 23455 maintenant celle qui est restée et est plus utilisé, la somme suivante est donc égale à 20 -1 (15 + 5 moins celle qui a été déposée), de sorte que la liste suivante serait 34559, puis 45596, puis 55969, puis 59694, nous nous arrêtons maintenant, car nous avons généré un nombre de graines complet. de chiffres donc initialement nous avions 12345.

Pour la graine suivante, nous avons 59694, il existe maintenant une sorte de raccourci que vous pouvez également utiliser une fois qu'une graine complète a été calculée, ou le raccourci lui-même peut être utilisé, c'est-à-dire que vous prenez le dernier chiffre, multipliez-le par 2 et soustraire le premier chiffre en doublant un chiffre se fait facilement en tête, l’important est de se rappeler tous les autres chiffres et leur ordre dans la séquence, cela produira au mieux, bien que ne produise que des nombres pseudo-aléatoires, avec des temps de répétition longs les plus grands la liste des numéros que vous utilisez, mais la liste initiale doit être choisie avec soin, comme par exemple, ne choisissez pas tous les zéros que vous listez, sinon vous aurez un flot infini de zéros et certains jeux de chiffres produiront des cycles de répétition plus longs que d’autres (mais peut-être que cela devrait être fait sur papier à condition que vous ayez un crayon ou un stylo et une feuille de papier à portée de main ... :) espérons que cela aide .. (modifié un peu, cela fait le début d’un très bon vrai générateur de nombres aléatoires ) prendre plaisir...

J'espère que cela va mieux si ce n'est pas le cas alors dites-le moi :) (je n'ai jamais été très bon en anglais! :)

0
John Einem

Le moyen le plus simple serait de générer plusieurs nombres qui vous viennent à l’esprit, puis de résumer et de modifier chacun des 10 chiffres. Plus vous ajoutez de chiffres, plus il sera aléatoire et biaisé.

510932
689275
539108
======
628205
0
Shai Coleman

Si des algorithmes non déterministes sont autorisés, vos yeux sont dans votre tête, alors que dire de "quelque chose comme" le nombre d'objets rouges devant moi plus le nombre d'objets bleus modulo le nombre d'objets verts plus la hauteur de la plus haute pile d'objets contenant au moins une chose avec les lettres g et la lettre majuscule A dessus. "

Je suis sûr qu'il existe un moyen de faire cela qui serait en fait assez aléatoire.

0
EternityForest