De una dirección de correo electrónico a un número cuasialeatorio [cerrado]

10

Mi objetivo:

Me gustaría tener una función que tome una dirección de correo electrónico y genere un número cuasialeatorio de 1, 2, 3 o 4.

Un pequeño detalle:

Por número cuasialeatorio quiero decir que, dada una población típica de direcciones de correo electrónico, las probabilidades de obtener un valor de 1, 2, 3 o 4 son aproximadamente iguales, y que las propiedades sistemáticas obvias de la dirección de correo electrónico, como el nombre de dominio no afecta la probabilidad de obtener un valor de 1, 2, 3 o 4.

Un poco de historia:

Tengo un experimento en línea escrito con curiosidad donde los participantes inician sesión en dos ocasiones. Quiero asignar participantes al azar a uno de los cuatro grupos. Si bien esto es fácil de hacer para una sesión (solo puedo usar un generador de números aleatorios), necesito alguna forma de recordar la asignación entre sesiones. Por lo tanto, pensé que podría extraer una asignación de grupo cuasialeatoria del correo electrónico del participante. También estoy limitado en el conjunto de funciones que tengo a mi disposición ( vea aquí la lista completa ). Las funciones de cadena son: tolower toupper capitalizar concat search replaceall contiene comienza con fin con subcadena trim trimright trimleft longitud formato evaluar

Pensamientos iniciales

Pensé en tratar de extraer un conjunto de características de la dirección de correo electrónico que devolvió un valor de 1, 2, 3 o 4 con probabilidades más o menos iguales. Entonces, podría sumar estas propiedades y obtener el mod 4 más 1 de eso. Por lo tanto, suponiendo algo así como el teorema del límite central, podría acercarme.

Posibles características que me vinieron a la mente:

  • longitud de cuerda
  • posición de la primera "a", "b", etc.
Jeromy Anglim
fuente
1
Un problema muy interesante. ¿Tiene una muestra de "población típica de direcciones de correo electrónico" a la mano? Además, no está garantizado que las direcciones de correo electrónico de los visitantes tengan la misma estructura diferente / diferente, pero dado que solo está buscando una aproximación ... Segunda pregunta: ¿Puede establecer la semilla del RNG?
steffen
66
Parece que quiere una 'función hash': en.wikipedia.org/wiki/Hash_function Esto está en el ámbito de la informática en lugar de las estadísticas, así que no estoy seguro de que pertenezca a CrossValidated.
parada
1
hmpf;) ... Tenía la intención de escribir lo mismo. @ Jeromy: Especialmente esta parte del sitio ( en.wikipedia.org/wiki/… ) podría ser interesante para usted.
steffen
@onestop Gracias por el consejo sobre hashtags. Con respecto a si la pregunta es sobre el tema del sitio, creo que la asignación aleatoria de los participantes a los grupos está inherentemente relacionada con el diseño del estudio, que a su vez está relacionado con las inferencias de los datos.
Jeromy Anglim
1
@Jeremy ¡Una función hash no es lo mismo que un hashtag! Sin embargo, veo su punto sobre el diseño del estudio. Admito no leer toda su pregunta correctamente.
parada

Respuestas:

3

¿Por qué no simplemente tener una tabla de búsqueda de números para cada posible personaje en un correo electrónico? Luego concatena los números para formar una semilla. Por ejemplo,

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

Entonces abc @ ccc, se convertiría a 12327333. Esto le daría una semilla única para cada persona. Luego usaría esto para generar el 1, 2, 3, 4.


Según su pregunta, parece que no le importa una "solución rápida y sucia". Un problema con mi solución es que las direcciones de correo electrónico no son aleatorias; por ejemplo, probablemente obtendrá muy pocas direcciones de correo electrónico que contengan la letra "z", pero todas las direcciones de correo electrónico contienen "@".

csgillespie
fuente
Una nota menor sobre el método anterior es que hay un montón de caracteres válidos en las direcciones de correo electrónico, en particular los signos de puntuación, que desearía considerar si estuviera haciendo esto.
dsolimano
@dsol: estoy de acuerdo. Usted podría quedar atrapado fácilmente con un "+" en una dirección de correo electrónico. Para una solución rápida y sucia, probablemente omita los caracteres de puntuación que no haya especificado en mi tabla de búsqueda.
csgillespie
1

Como complemento a otras excelentes respuestas, solo daré un ejemplo simple en lenguaje R para mostrar una función hash muy simple, que debería ser lo suficientemente buena para este propósito. Para obtener algunas direcciones de correo electrónico como datos de prueba, obtengo un vector de caracteres con los correos electrónicos de los encargados del mantenimiento (¡demasiados!) Paquetes R instalados en mi computadora:

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)

Luego defino una función simple que obtiene un número de cada carácter en la dirección de correo electrónico, los agrega, calcula el resto del módulo 4 y agrega 1, por lo que siempre devuelve uno de los resultados 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

Luego aplicándolo:

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

y podemos observar que la distribución resultante es cercana a la uniforme.

kjetil b halvorsen
fuente
0

Podría intentar convertir cada carácter en un número ascii, multiplicándolos todos juntos para forzar el desbordamiento y luego realizando una operación de módulo en los dígitos menos significativos. Si esto no es lo suficientemente seudoaleatorio, puede realizar un cambio de bits un poco ...

-Ralph Winters

Ralph Winters
fuente
2
Multiplicar no es la mejor idea, creo. Especialmente si su desbordamiento inicial es el normal: módulo con una potencia de 2. Obtendrá muchos factores que son pares, por lo que la mayoría de sus bits más bajos serán 0. Sumar los números en su lugar ya sería mucho mejor. Si necesita una aleatoriedad aún mejor, use algún tipo de función hash y use cualquier bit del resultado. Si desea que sea difícil adivinar algo sobre el resultado para personas que no sean usted, use una función hash criptográfica fuerte y salada.
Erik P.
Convenido. Solo quería sugerir una idea para ilustrar el desplazamiento de bits para generar (aproximadamente) números pseudoaleatorios.
Ralph Winters