Mein Ziel:
Ich hätte gerne eine Funktion, die eine E-Mail-Adresse verwendet und eine quasi zufällige Zahl von 1, 2, 3 oder 4 ausgibt.
Ein kleines Detail:
Mit Quasi-Zufallszahl meine ich, dass bei einer typischen Population von E-Mail-Adressen die Wahrscheinlichkeiten, einen Wert von 1, 2, 3 oder 4 zu erhalten, ungefähr gleich sind und dass offensichtliche systematische Eigenschaften der E-Mail-Adresse wie der Domain-Name dies tun die Wahrscheinlichkeit, einen Wert von 1, 2, 3 oder 4 zu erhalten, nicht beeinflussen.
Ein kleiner Hintergrund:
Ich habe ein Online-Experiment in Inquisit geschrieben, bei dem sich die Teilnehmer zweimal anmelden. Ich möchte die Teilnehmer zufällig einer von vier Gruppen zuordnen. Während dies für eine Sitzung einfach ist (ich kann nur einen Zufallszahlengenerator verwenden), muss ich mich an die Zuordnung zwischen den Sitzungen erinnern. Daher dachte ich, ich könnte eine quasi zufällige Gruppenzuordnung aus der Teilnehmer-E-Mail extrahieren. Ich bin auch in den Funktionen eingeschränkt, die mir zur Verfügung stehen ( eine vollständige Liste finden Sie hier ). Die Zeichenfolgenfunktionen sind: tolower toupper groß schreiben concat search replaceeall enthält Starts mit Enden mit Teilstring Trim Trimright Trimleft Länge Format auswerten
Erste Gedanken:
Ich dachte darüber nach, eine Reihe von Funktionen der E-Mail-Adresse zu extrahieren, die einen Wert von 1, 2, 3 oder 4 mit ungefähr gleichen Wahrscheinlichkeiten zurückgeben. Dann könnte ich diese Eigenschaften summieren und den Mod 4 plus 1 davon bekommen. Wenn ich also so etwas wie den zentralen Grenzwertsatz annehme, könnte ich näher kommen.
Mögliche Funktionen, die mir in den Sinn kamen:
- Länge der Zeichenfolge
- Position des ersten "a", "b" usw.
quelle
Antworten:
Suchen Sie nach Hash-Funktionen, beispielsweise unter http://en.wikipedia.org/wiki/Hash_function
quelle
Warum nicht einfach eine Nachschlagetabelle mit Zahlen für jedes mögliche Zeichen in einer E-Mail haben? Verketten Sie dann die Zahlen, um einen Startwert zu bilden. Zum Beispiel,
Abc @ ccc würde also in 12327333 konvertiert. Dies würde Ihnen einen eindeutigen Startwert für jede Person geben. Sie würden dies dann verwenden, um die 1, 2, 3, 4 zu generieren.
Aus Ihrer Frage geht hervor, dass Ihnen eine "schnelle und schmutzige Lösung" nichts ausmacht. Ein Problem mit meiner Lösung ist, dass E-Mail-Adressen nicht zufällig sind. Beispielsweise erhalten Sie wahrscheinlich nur sehr wenige E-Mail-Adressen, die den Buchstaben "z" enthalten, aber alle E-Mail-Adressen enthalten "@".
quelle
Als Ergänzung zu anderen hervorragenden Antworten werde ich nur ein einfaches Beispiel in R-Sprache geben, um eine sehr einfache Hash-Funktion zu zeigen, die für diesen Zweck gut genug sein sollte. Um einige E-Mail-Adressen als Testdaten zu erhalten, erhalte ich einen Zeichenvektor mit den E-Mails der Betreuer der (zu vielen!) R-Pakete, die auf meinem Computer installiert sind:
Dann definiere ich eine einfache Funktion, die von jedem Zeichen in der E-Mail-Adresse eine Nummer erhält, diese hinzufügt, den Rest Modulo 4 berechnet und 1 hinzufügt, sodass immer eines der Ergebnisse 1,2,3 oder 4 zurückgegeben wird:
Dann anwenden:
und wir können beobachten, dass die resultierende Verteilung nahezu gleichmäßig ist.
quelle
Sie können versuchen, jedes Zeichen in eine ASCII-Zahl umzuwandeln, alle miteinander zu multiplizieren, um einen Überlauf zu erzwingen, und dann eine Moduloperation mit den niedrigstwertigen Ziffern ausführen. Wenn dies nicht pseudozufällig genug ist, können Sie die Zahlen ein bisschen verschieben ...
-Ralph Winters
quelle