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.
fuente
Respuestas:
Busque funciones hash, por ejemplo en http://en.wikipedia.org/wiki/Hash_function
fuente
¿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,
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 "@".
fuente
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:
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:
Luego aplicándolo:
y podemos observar que la distribución resultante es cercana a la uniforme.
fuente
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
fuente