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.
fonte
Respostas:
Procure funções de hash, por exemplo, em http://en.wikipedia.org/wiki/Hash_function
fonte
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,
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 "@".
fonte
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:
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:
Em seguida, aplicando-o:
e podemos observar que a distribuição resultante é quase uniforme.
fonte
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
fonte