Von einer E-Mail-Adresse zu einer Quasi-Zufallszahl [geschlossen]

10

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.
Jeromy Anglim
quelle
1
Ein sehr interessantes Problem. Haben Sie eine Stichprobe der "typischen Population von E-Mail-Adressen" zur Hand? Außerdem kann nicht garantiert werden, dass die E-Mail-Adressen der Besucher dieselbe andere / unterschiedliche Struktur haben, aber da Sie nur nach einer Annäherung suchen ... Zweite Frage: Können Sie den Startwert des RNG festlegen?
steffen
6
Klingt so, als ob Sie eine 'Hash-Funktion' wollen: en.wikipedia.org/wiki/Hash_function Dies ist eher im Bereich der Informatik als in der Statistik, daher bin ich mir nicht sicher, ob es zu CrossValidated gehört.
Onestop
1
hmpf;) ... ich wollte dasselbe schreiben. @ Jeromy: Besonders dieser Teil der Seite ( en.wikipedia.org/wiki/… ) könnte für Sie interessant sein.
steffen
@onestop Danke für den Tipp zu Hashtags. In Bezug darauf, ob die Frage zum Thema der Website gehört, denke ich, dass die zufällige Zuordnung von Teilnehmern zu Gruppen inhärent mit dem Studiendesign zusammenhängt, was wiederum mit Schlussfolgerungen aus Daten zusammenhängt.
Jeromy Anglim
1
@Jeremy Eine Hash-Funktion ist überhaupt nicht dasselbe wie ein Hashtag! Ich verstehe Ihren Standpunkt zum Studiendesign. Ich gebe zu, dass ich Ihre ganze Frage nicht richtig gelesen habe.
Onestop

Antworten:

3

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,

A 1
B 2
C 3
....
@ 27
....

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 "@".

csgillespie
quelle
Ein kleiner Hinweis zu der oben genannten Methode ist, dass E-Mail-Adressen eine Reihe gültiger Zeichen enthalten - insbesondere Interpunktion -, die Sie in Betracht ziehen sollten, wenn Sie dies tun.
Dsolimano
@dsol: Ich stimme zu. Sie könnten leicht mit einem "+" in einer E-Mail-Adresse erwischt werden. Für eine schnelle und schmutzige Lösung würde ich wahrscheinlich nur alle Satzzeichen überspringen, die ich nicht in meiner Nachschlagetabelle angegeben hatte.
Csgillespie
1

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:

library(stringr) # on CRAN 
last <- function(x) { return( x[length(x)] ) }

INST  <-  installed.packages(priority="NA", fields=c("Maintainer"))
Maintainer <- INST[, "Maintainer"]
Mlist <- str_split(Maintainer, "[[:blank:]]")
Maddr <- sapply(Mlist, FUN=last)
Maddr <- str_replace(Maddr, "[<>]", "")
Maddr <- unique(Maddr)

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:

apply_to_each_char  <-  function(w, FUN) {
    ww <-  str_split(w, "")[[1]]
    res <- sapply(ww, FUN)
    } # END apply_to_each_char
charsum <- function(word) { # length-one char vector
    sum0 <- sum( apply_to_each_char(word, function(w) as.integer(charToRaw(w)) ))
    return( 1 + sum0 %% 4)
    } # end charsum

Dann anwenden:

hashes <- sapply(Maddr, charsum)
table(hashes)
hashes
  1   2   3   4 
542 511 562 552 

und wir können beobachten, dass die resultierende Verteilung nahezu gleichmäßig ist.

kjetil b halvorsen
quelle
0

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

Ralph Winters
quelle
2
Multiplizieren ist nicht die beste Idee, denke ich. Vor allem, wenn Ihr anfänglicher Überlauf der reguläre ist - Modulo mit einer Potenz von 2. Sie erhalten viele Faktoren, die gerade sind, so dass die meisten Ihrer unteren Bits 0 sind. Das Addieren der Zahlen stattdessen wäre bereits viel besser. Wenn Sie eine noch bessere Zufälligkeit benötigen, verwenden Sie eine Art Hash-Funktion und verwenden Sie beliebige Bits des Ergebnisses. Wenn Sie möchten, dass es für andere Personen als Sie schwierig ist, etwas über das Ergebnis zu erraten, verwenden Sie eine gesalzene, starke kryptografische Hash-Funktion.
Erik P.
Einverstanden. Ich wollte nur eine Idee vorschlagen, um die Bitverschiebung zu veranschaulichen, um (ungefähr) Pseudozufallszahlen zu erzeugen.
Ralph Winters