Da un indirizzo e-mail a un numero quasi casuale [chiuso]


10

Il mio obiettivo:

Mi piacerebbe avere una funzione che accetta un indirizzo e-mail e genera un numero quasi casuale di 1, 2, 3 o 4.

Un piccolo dettaglio:

Per numero quasi casuale voglio dire che data una popolazione tipica di indirizzi e-mail, le probabilità di ottenere un valore di 1, 2, 3 o 4 sono approssimativamente uguali e che le proprietà sistematiche ovvie dell'indirizzo e-mail come il nome di dominio lo fanno non influisce sulla probabilità di ottenere un valore di 1, 2, 3 o 4.

Un piccolo sfondo:

Ho un esperimento on-line scritto in inquisit dove i partecipanti il log-in in due occasioni. Voglio assegnare casualmente i partecipanti a uno dei quattro gruppi. Mentre questo è facile da fare per una sessione (posso semplicemente usare un generatore di numeri casuali), ho bisogno di un modo di ricordare l'allocazione tra le sessioni. Pertanto, ho pensato di poter estrarre un'allocazione di gruppo quasi casuale dall'e-mail del partecipante. Sono anche limitato nel set di funzioni che ho a disposizione ( vedi qui per l'elenco completo ). Le funzioni delle stringhe sono: tolower toupper capitalize ricerca concat sostituisce tutti gli start con le estremità con trim di sottostringa trimright trimleft lunghezza formato valuta

Pensieri iniziali:

Ho pensato di provare a estrarre un set di funzionalità dell'indirizzo e-mail che ha restituito un valore di 1, 2, 3 o 4 con probabilità approssimativamente uguali. Quindi, potrei sommare queste proprietà e ottenere la mod 4 più 1 di quella. Quindi, supponendo qualcosa di simile al teorema del limite centrale, potrei avvicinarmi.

Possibili caratteristiche che mi sono venute in mente:

  • lunghezza della corda
  • posizione della prima "a", "b", ecc.

1
Un problema molto interessante Hai un campione di "popolazione tipica di indirizzi e-mail" a portata di mano? Inoltre, non è garantito che gli indirizzi e-mail dei visitatori abbiano la stessa struttura diversa / diversa, ma poiché stai solo cercando un'approssimazione .... Seconda domanda: sei in grado di impostare il seme dell'RNG?
Steffen,

6
Sembra che tu voglia una 'funzione hash': en.wikipedia.org/wiki/Hash_function Questo è nel regno dell'informatica piuttosto che nelle statistiche, quindi non sono sicuro che appartenga a CrossValidated.
onestop,

1
hmpf;) ... Avevo intenzione di scrivere lo stesso. @Jeromy: Soprattutto questa parte del sito ( en.wikipedia.org/wiki/… ) potrebbe essere interessante per te.
Steffen,

@onestop Grazie per il suggerimento sugli hashtag. Per quanto riguarda la questione se la questione è in tema per il sito, penso che l'allocazione casuale dei partecipanti ai gruppi sia intrinsecamente correlata al progetto dello studio, che a sua volta è correlato alle inferenze dai dati.
Jeromy Anglim,

1
@Jeremy Una funzione hash non è affatto la stessa cosa di un hashtag! Vedo il tuo punto sul design dello studio però. Ammetto di non aver letto tutta la tua domanda correttamente.
Onestop,

Risposte:



3

Perché non avere solo una tabella di numeri di ricerca per ogni possibile carattere in un'e-mail. Quindi concatena i numeri per formare un seme. Per esempio,

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

Quindi abc @ ccc, verrebbe convertito in 12327333. Questo ti darebbe un seme unico per ogni persona. Lo useresti quindi per generare 1, 2, 3, 4.


Dalla tua domanda, sembra che non ti dispiaccia una "soluzione rapida e sporca". Un problema con la mia soluzione è che gli indirizzi e-mail non sono casuali, ad esempio probabilmente avrai pochissimi indirizzi e-mail che contengono la lettera "z", ma tutti gli indirizzi e-mail contengono "@".


Una nota minore sul metodo sopra è che ci sono un sacco di caratteri validi negli indirizzi e-mail - punteggiatura in particolare - che dovresti prendere in considerazione se lo facessi.
dsolimano,

@dsol: sono d'accordo. Potresti essere facilmente scoperto con un "+" in un indirizzo email. Per una soluzione rapida e sporca, probabilmente salterei semplicemente i caratteri di punteggiatura che non avevo specificato nella mia tabella di ricerca.
csgillespie,

1

Come aggiunta ad altre eccellenti risposte, darò solo un semplice esempio in linguaggio R per mostrare una funzione hash molto semplice, che dovrebbe essere abbastanza buona per questo scopo. Per ottenere alcuni indirizzi e-mail come dati di test, ottengo un vettore di carattere con le e-mail dei manutentori dei (troppi!) Pacchetti R installati sul mio computer:

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)

Quindi definisco una semplice funzione che ottiene un numero da ciascun carattere dell'indirizzo e-mail, li aggiunge, calcola il resto del modulo 4 e aggiunge 1, quindi restituisce sempre uno dei risultati 1,2,3 o 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

Quindi applicandolo:

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

e possiamo osservare che la distribuzione risultante è quasi uniforme.


0

Potresti provare a convertire ciascun carattere in un numero ASCII, moltiplicandoli tutti insieme per forzare l'overflow e quindi eseguire un'operazione di modulo sulle cifre meno significative. Se questo non è abbastanza pseudo-casuale, puoi eseguire un po 'di spostamento dei numeri un po' ...

-Ralph Winters


2
Moltiplicare non è la migliore idea, penso. Soprattutto se il tuo overflow iniziale è quello normale - modulo un po 'di potenza di 2. Otterrai molti fattori che sono pari, quindi la maggior parte dei bit inferiori sarà 0. L'aggiunta dei numeri invece sarebbe già molto meglio. Se hai bisogno di una casualità ancora migliore, usa una sorta di funzione hash e usa qualsiasi bit del risultato. Se vuoi che sia difficile indovinare qualcosa sul risultato per persone diverse da te, usa una forte funzione hash crittografica salata.
Erik P.

Concordato. Volevo solo suggerire l'idea di illustrare lo spostamento dei bit per generare numeri (approssimativamente) pseudo-casuali.
Ralph Winters,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.