Od adresu e-mail po quasi-losowy numer [zamknięty]

10

Mój cel:

Chciałbym mieć funkcję, która pobiera adres e-mail i wyświetla quasi-losową liczbę 1, 2, 3 lub 4.

Mały szczegół:

Przez quasi-losową liczbę rozumiem, że biorąc pod uwagę typową populację adresów e-mail, prawdopodobieństwo uzyskania wartości 1, 2, 3 lub 4 jest w przybliżeniu równe, a oczywiste systematyczne właściwości adresu e-mail, takie jak nazwa domeny, nie wpływa na prawdopodobieństwo uzyskania wartości 1, 2, 3 lub 4.

Trochę tła:

Mam internetowy eksperyment napisany w zapytaniu, w którym uczestnicy logują się dwa razy. Chcę losowo przypisać uczestników do jednej z czterech grup. Chociaż jest to łatwe do zrobienia dla jednej sesji (mogę po prostu użyć generatora liczb losowych), potrzebuję jakiegoś sposobu zapamiętania alokacji między sesjami. Pomyślałem więc, że mogę wyodrębnić quasi-losowy przydział grupy z e-maila uczestnika. Mam również ograniczony zestaw funkcji, które mam do dyspozycji ( pełna lista znajduje się tutaj ). Funkcje ciągów to: tolower toupper wielkie litery konkat szukaj zamień zawiera początki z końcami z podciągiem przycięcie prawy trym format długości ocena

Wstępne myśli:

Myślałem o próbie wyodrębnienia zestawu funkcji adresu e-mail, które zwróciły wartość 1, 2, 3 lub 4 z mniej więcej równymi prawdopodobieństwami. Następnie mógłbym zsumować te właściwości i uzyskać mod 4 plus 1 tego. Zakładając coś w rodzaju centralnego twierdzenia o granicy, mogę się zbliżyć.

Możliwe funkcje, które przyszły mi do głowy:

  • długość sznurka
  • pozycja pierwszego „a”, „b” itp.
Jeromy Anglim
źródło
1
Bardzo interesujący problem. Czy masz pod ręką próbkę „typowej populacji adresów e-mail”? Ponadto nie ma gwarancji, że adresy e-mail odwiedzających mają tę samą inną / inną strukturę, ale ponieważ szukasz tylko przybliżenia ... Drugie pytanie: Czy jesteś w stanie ustawić ziarno RNG?
steffen
6
Wygląda na to, że chcesz mieć funkcję skrótu: en.wikipedia.org/wiki/Hash_function Jest to raczej dziedzina informatyki niż statystyki, więc nie jestem pewien, czy należy ona do CrossValidated.
onestop
1
hmpf;) ... Zamierzałem napisać to samo. @Jeromy: Szczególnie ta część strony ( en.wikipedia.org/wiki/… ) może być dla Ciebie interesująca.
steffen
@onestop Dzięki za wskazówkę dotyczącą hashtagów. Jeśli chodzi o to, czy pytanie dotyczy tematu witryny, uważam, że losowy przydział uczestników do grup jest nierozerwalnie związany z projektem badania, co z kolei wiąże się z wnioskami z danych.
Jeromy Anglim
1
@Jeremy Funkcja skrótu to wcale nie to samo, co hashtag! Widzę jednak twój punkt widzenia na temat projektu badania. Przyznaję, że nie przeczytałem właściwie całego twojego pytania.
onestop

Odpowiedzi:

3

Dlaczego nie mieć po prostu tabeli liczb dla każdej możliwej postaci w wiadomości e-mail. Następnie połącz liczby, aby utworzyć ziarno. Na przykład,

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

Więc abc @ ccc, zostanie przekonwertowany na 12327333. To da unikalne ziarno dla każdej osoby. Następnie użyłbyś tego do wygenerowania 1, 2, 3, 4.


Z twojego pytania wynika, że ​​nie masz nic przeciwko „szybkiemu i brudnemu rozwiązaniu”. Jednym z problemów z moim rozwiązaniem jest to, że adresy e-mail nie są losowe - na przykład prawdopodobnie otrzymasz bardzo niewiele adresów e-mail zawierających literę „z”, ale wszystkie adresy e-mail zawierają „@”.

csgillespie
źródło
Niewielka uwaga na temat powyższej metody polega na tym, że w adresach e-mail znajduje się garść prawidłowych znaków - w szczególności interpunkcyjnych - które warto rozważyć, jeśli to robisz.
dsolimano
@dsol: Zgadzam się. Możesz łatwo dać się złapać za pomocą „+” w adresie e-mail. Aby uzyskać szybkie i brudne rozwiązanie, prawdopodobnie po prostu pominąłem znaki interpunkcyjne, których nie podałem w mojej tabeli przeglądowej.
csgillespie
1

Jako dodatek do innych doskonałych odpowiedzi, podam prosty przykład w języku R, aby pokazać bardzo prostą funkcję skrótu, która powinna być wystarczająca do tego celu. Aby uzyskać adresy e-mail jako dane testowe, otrzymuję wektor znaków z e-mailami opiekunów (zbyt wielu!) Pakietów R zainstalowanych na moim komputerze:

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)

Następnie definiuję prostą funkcję, która pobiera pewną liczbę z każdego znaku w adresie e-mail, dodaje je, oblicza resztę modulo 4 i dodaje 1, więc zawsze zwraca jeden z wyników 1,2,3 lub 4:

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

Następnie zastosuj:

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

i możemy zaobserwować, że wynikowy rozkład jest zbliżony do jednorodności.

kjetil b halvorsen
źródło
0

Możesz spróbować przekonwertować każdy znak na liczbę ascii, pomnożenie ich wszystkich razem, aby wymusić przepełnienie, a następnie wykonanie operacji modułu na najmniej znaczących cyfrach. Jeśli nie jest to wystarczająco pseudolosowe, możesz nieco przesunąć cyfry ...

-Ralph Winters

Ralph Winters
źródło
2
Myślę, że pomnażanie nie jest najlepszym pomysłem. Zwłaszcza jeśli twoje początkowe przelanie jest normalne - modulo trochę potęgi 2. Otrzymasz wiele czynników, które są równe, więc większość twoich mniejszych bitów wyniesie 0. Dodanie liczb razem zamiast tego byłoby już znacznie lepsze. Jeśli potrzebujesz jeszcze lepszej losowości, użyj funkcji skrótu i użyj dowolnych bitów wyniku. Jeśli chcesz, aby trudno było zgadnąć cokolwiek na temat wyników dla osób innych niż ty, użyj solonej silnej funkcji kryptograficznej.
Erik P.,
Zgoda. Chciałem tylko zasugerować pomysł zilustrowania przesunięcia bitów w celu wygenerowania (z grubsza) liczb pseudolosowych.
Ralph Winters