Mon but:
J'aimerais avoir une fonction qui prend une adresse e-mail et génère un nombre quasi-aléatoire de 1, 2, 3 ou 4.
Un petit détail:
Par nombre quasi-aléatoire, je veux dire que compte tenu d'une population typique d'adresses e-mail, les probabilités d'obtenir une valeur de 1, 2, 3 ou 4 sont à peu près égales, et que les propriétés systématiques évidentes de l'adresse e-mail telles que le nom de domaine n'affecte pas la probabilité d'obtenir une valeur de 1, 2, 3 ou 4.
Un peu d'histoire:
J'ai une expérience en ligne écrite inquisit où les participants se connectent à deux reprises. Je souhaite affecter au hasard les participants à l'un des quatre groupes. Bien que cela soit facile à faire pour une session (je peux simplement utiliser un générateur de nombres aléatoires), j'ai besoin d'un moyen de me souvenir de l'allocation entre les sessions. Ainsi, j'ai pensé que je pouvais extraire une allocation de groupe quasi aléatoire de l'e-mail du participant. Je suis également limité dans l'ensemble des fonctions dont j'ai à ma disposition ( voir ici pour la liste complète ). Les fonctions de chaîne sont les suivantes: tolower toupper capitalize concat search replaceall contient startswith endswith substring trim trimright trimleft longueur format evalu
Réflexions initiales:
J'ai pensé à essayer d'extraire un ensemble de fonctionnalités de l'adresse e-mail qui renvoyaient une valeur de 1, 2, 3 ou 4 avec des probabilités à peu près égales. Ensuite, je pourrais additionner ces propriétés et obtenir le mod 4 plus 1 de cela. Ainsi, en supposant quelque chose comme le théorème de la limite centrale, je pourrais me rapprocher.
Caractéristiques possibles qui me sont venues à l'esprit:
- longueur de chaîne
- position du premier "a", "b", etc.
la source
Réponses:
Recherchez les fonctions de hachage, par exemple sur http://en.wikipedia.org/wiki/Hash_function
la source
Pourquoi ne pas simplement avoir une table de recherche de nombres pour chaque caractère possible dans un e-mail. Ensuite, enchaînez les nombres pour former une graine. Par exemple,
Donc abc @ ccc, serait converti en 12327333. Cela vous donnerait une graine unique pour chaque personne. Vous utiliseriez alors ceci pour générer les 1, 2, 3, 4.
De votre question, il semble que cela ne vous dérange pas une "solution rapide et sale". Un problème avec ma solution est que les adresses e-mail ne sont pas aléatoires - par exemple, vous obtiendrez probablement très peu d'adresses e-mail contenant la lettre "z", mais toutes les adresses e-mail contiennent "@".
la source
En plus d'autres excellentes réponses, je vais simplement donner un exemple simple en langage R pour montrer une fonction de hachage très simple, qui devrait être assez bonne à cet effet. Pour obtenir des adresses e-mail en tant que données de test, j'obtiens un vecteur de caractères avec les e-mails des responsables des (trop nombreux!) Packages R installés sur mon ordinateur:
Ensuite, je définis une fonction simple qui obtient un certain nombre de chaque caractère dans l'adresse e-mail, les ajoute, calcule le reste modulo 4 et ajoute 1, de sorte qu'il renvoie toujours l'un des résultats 1, 2, 3 ou 4:
Puis l'appliquer:
et nous pouvons observer que la distribution résultante est presque uniforme.
la source
Vous pouvez essayer de convertir chaque caractère en nombre ascii, en les multipliant tous ensemble pour forcer le débordement, puis en effectuant une opération de module sur les chiffres les moins significatifs. Si ce n'est pas assez pseudo-aléatoire, vous pouvez effectuer un bit-shift les nombres un peu ...
-Ralph Winters
la source