De um endereço de email a um número quase aleatório [fechado]

10

O meu objectivo:

Gostaria de ter uma função que pega um endereço de email e gera um número quase aleatório de 1, 2, 3 ou 4.

Um pequeno detalhe:

Por número quase aleatório, quero dizer que, dada uma população típica de endereços de email, as probabilidades de obter um valor de 1, 2, 3 ou 4 são aproximadamente iguais e que as propriedades sistemáticas óbvias do endereço de email, como o nome de domínio, não não afeta a probabilidade de obter um valor de 1, 2, 3 ou 4.

Um pouco de fundo:

Eu tenho um experimento on-line escrito no inquisit, onde os participantes se conectam em duas ocasiões. Quero designar aleatoriamente os participantes para um dos quatro grupos. Embora isso seja fácil de fazer em uma sessão (posso usar apenas um gerador de números aleatórios), preciso de alguma maneira de lembrar a alocação entre as sessões. Assim, pensei em extrair uma alocação de grupo quase aleatória do email do participante. Também estou limitado no conjunto de funções que tenho à minha disposição ( veja aqui a lista completa ). As funções de cadeia de caracteres são: para reduzir a capitalização da pesquisa de concatenar a busca contém todos os começos com o fim da subcamada de substring

Pensamentos iniciais:

Pensei em tentar extrair um conjunto de recursos do endereço de email que retornasse um valor de 1, 2, 3 ou 4 com probabilidades aproximadamente iguais. Então, eu poderia somar essas propriedades e obter o mod 4 mais 1 disso. Assim, assumindo algo como o teorema do limite central, eu poderia me aproximar.

Possíveis recursos que me vieram à mente:

  • comprimento da corda
  • posição do primeiro "a", "b" etc.
Jeromy Anglim
fonte
11
Um problema muito interessante. Você tem uma amostra da "população típica de endereços de email" em mãos? Além disso, não é garantido que os endereços de e-mail dos visitantes tenham a mesma estrutura diferente / diferente, mas como você está procurando apenas uma aproximação ... Segunda pergunta: Você pode definir a semente do RNG?
steffen
6
Parece que você quer uma 'função hash': en.wikipedia.org/wiki/Hash_function Isso é mais no domínio da ciência da computação do que na estatística, então não tenho certeza de que ele pertença ao CrossValidated.
onestop
11
hmpf;) ... eu pretendia escrever o mesmo. @ Jeromy: Especialmente esta parte do site ( en.wikipedia.org/wiki/… ) pode ser interessante para você.
Steffen
@onestop Obrigado pela dica sobre hashtags. Com relação à questão de saber se o assunto está relacionado ao site, acho que a alocação aleatória de participantes a grupos está inerentemente relacionada ao desenho do estudo, que, por sua vez, está relacionado às inferências dos dados.
Jeromy Anglim
11
@ Jeremy Uma função hash não é a mesma coisa que uma hashtag! Eu vejo o seu ponto sobre o desenho do estudo. Eu admito não ter lido corretamente toda a sua pergunta.
onestop

Respostas:

3

Por que não basta ter uma tabela de números de pesquisa para cada caractere possível em um email. Em seguida, concatene os números para formar uma semente. Por exemplo,

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

Portanto, abc @ ccc seria convertido em 12327333. Isso forneceria uma semente única para cada pessoa. Você usaria isso para gerar o 1, 2, 3, 4.


Da sua pergunta, parece que você não se importa com uma "solução rápida e suja". Um problema com minha solução é que os endereços de email não são aleatórios - por exemplo, você provavelmente obterá muito poucos endereços de email que contenham a letra "z", mas todos os endereços de email contêm "@".

csgillespie
fonte
Uma observação secundária sobre o método acima é que existem vários caracteres válidos nos endereços de email - pontuação em particular - que você gostaria de considerar se estivesse fazendo isso.
Dsolimano
@dsol: eu concordo. Você pode facilmente ser pego com um "+" em um endereço de e-mail. Para uma solução rápida e suja, provavelmente ignoraria os caracteres de pontuação que não havia especificado na minha tabela de consulta.
csgillespie
1

Como complemento a outras excelentes respostas, apenas darei um exemplo simples na linguagem R para mostrar uma função hash muito simples, que deve ser boa o suficiente para esse fim. Para obter alguns endereços de email como dados de teste, recebo um vetor de caractere com os emails dos mantenedores dos pacotes R (muitos!) R instalados no meu computador:

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)

Em seguida, defino uma função simples que obtém um número de cada caractere no endereço de email, os adiciona, calcula o restante do módulo 4 e adiciona 1, para que sempre retorne um dos resultados 1,2,3 ou 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

Em seguida, aplicando-o:

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

e podemos observar que a distribuição resultante é quase uniforme.

kjetil b halvorsen
fonte
0

Você pode tentar converter cada caractere em um número ascii, multiplicando-os todos para forçar o estouro e, em seguida, executando uma operação de módulo nos dígitos menos significativos. Se isso não for pseudo-aleatório o suficiente, você poderá alterar um pouco os números ...

-Ralph Winters

Ralph Winters
fonte
2
Multiplicar não é a melhor ideia, eu acho. Especialmente se o seu estouro inicial for o normal - modulo com alguma potência de 2. Você obterá muitos fatores iguais, portanto a maioria dos seus bits inferiores será 0. Adicionar os números juntos já seria muito melhor. Se você precisar de uma aleatoriedade ainda melhor, use algum tipo de função hash e use quaisquer bits do resultado. Se você quiser que seja difícil adivinhar algo sobre o resultado para outras pessoas que não você, use uma função hash criptográfica forte salgada.
Erik P.
Acordado. Só queria sugerir uma idéia para ilustrar a mudança de bits, a fim de gerar (aproximadamente) números pseudo-aleatórios.
Ralph Winters