이메일 주소에서 준 난수로 [닫힘]


10

나의 목표:

전자 메일 주소를 사용하여 준 난수 1, 2, 3 또는 4를 출력하는 기능을 갖고 싶습니다.

약간의 세부 사항 :

준 난수 (Quasi-random) 숫자로, 나는 전형적인 이메일 주소가 주어지면 1, 2, 3 또는 4의 값을 얻는 확률이 거의 같고 도메인 이름과 같은 이메일 주소의 명백한 체계적 속성은 1, 2, 3 또는 4의 값을 얻을 확률에 영향을 미치지 않습니다.

작은 배경 :

나는 작성된 온라인 실험이 inquisit 참가자가 두 차례에 로그인합니다. 네 그룹 중 하나에 무작위로 참가자를 할당하고 싶습니다. 이것은 한 세션에 대해 수행하기 쉽지만 (난수 생성기를 사용할 수 있음) 세션 간 할당을 기억하는 방법이 필요합니다. 따라서 참가자 이메일에서 준 무작위 그룹 할당을 추출 할 수 있다고 생각했습니다. 나는 또한 내가 가진 기능 세트에 제한이 있습니다 ( 전체 목록은 여기를 참조하십시오 ). 문자열 함수는 다음과 같습니다.

초기 생각 :

나는 거의 동일한 확률로 1, 2, 3 또는 4의 값을 반환하는 전자 메일 주소의 기능 집합을 추출하려고 시도했습니다. 그런 다음 이러한 속성을 합산하여 mod 4 + 1을 얻을 수 있습니다. 따라서 중심 제한 정리와 같은 것을 가정하면 가까이 갈 수 있습니다.

내 마음에 온 가능한 기능 :

  • 끈의 길이
  • 첫 번째 "a", "b"등의 위치

1
매우 흥미로운 문제입니다. "일반적인 이메일 주소"샘플이 준비되어 있습니까? 또한 방문자의 이메일 주소가 동일한 다른 / 다른 구조를 가지고 있음을 보장하지는 않지만 근사만을 찾고 있기 때문에 .... 두 번째 질문 : RNG의 씨앗을 설정할 수 있습니까?
steffen

6
'해시 함수'를 원하는 것처럼 들립니다. en.wikipedia.org/wiki/Hash_function 통계보다는 컴퓨터 과학의 영역에 있으므로 CrossValidated에 속하는지 확실하지 않습니다.
onestop

1
hmpf;) ... 나는 같은 것을 쓰려고했다. @Jeromy : 특히이 사이트 부분 ( en.wikipedia.org/wiki/… )이 흥미로울 수 있습니다.
steffen

@onestop 해시 태그에 대한 팁을 주셔서 감사합니다. 질문이 사이트에 대한 주제인지 여부와 관련하여 그룹에 참가자를 무작위로 할당하는 것은 본질적으로 연구 설계와 관련이 있으며 결과적으로 데이터의 추론과 관련이 있다고 생각합니다.
Jeromy Anglim

1
@Jeremy 해시 함수는 해시 태그와 전혀 다릅니다! 그래도 연구 설계에 대한 요점을 봅니다. 귀하의 질문 전체를 제대로 읽지 못합니다.
onestop

답변:



3

전자 우편의 가능한 각 문자에 대한 룩업 테이블 만 있으면 어떨까요? 그런 다음 숫자를 연결하여 씨앗을 만듭니다. 예를 들어

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

따라서 abc @ ccc는 12327333으로 변환됩니다. 그러면 각 사람에게 고유 한 씨앗이 제공됩니다. 그런 다음 이것을 사용하여 1, 2, 3, 4를 생성합니다.


귀하의 질문에서 "빠르고 더러운 해결책"을 신경 쓰지 않는 것 같습니다. 내 솔루션의 한 가지 문제는 전자 메일 주소가 임의적이지 않다는 것입니다. 예를 들어 문자 "z"가 포함 된 전자 메일 주소는 거의 없지만 모든 전자 메일 주소에는 "@"가 포함됩니다.


위의 방법에 대한 작은 참고 사항은 전자 메일 주소에 유효한 문자가 많이 있다는 것입니다. 특히 구두점을 사용하면이 작업을 수행 할 때 고려할 수 있습니다.
dsolimano

@ dsol : 동의합니다. 이메일 주소에 "+"가 있으면 쉽게 알아볼 수 있습니다. 빠르고 더러운 해결책을 찾으려면 검색 테이블에 지정하지 않은 문장 부호 문자를 건너 뛸 것입니다.
csgillespie

1

다른 훌륭한 답변 외에도 R 언어로 간단한 해시 함수를 보여주는 간단한 예제를 제공합니다.이 목적에 충분해야합니다. 테스트 데이터로 일부 전자 메일 주소를 얻으려면 컴퓨터에 설치된 (너무 많은!) R 패키지 관리자의 전자 메일이 포함 된 문자 벡터를 얻습니다.

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)

그런 다음 전자 메일 주소의 각 문자에서 숫자를 가져 와서 추가하고 나머지 모듈로 4를 계산하고 1을 추가하는 간단한 함수를 정의하므로 항상 결과 1, 2, 3 또는 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

그런 다음 적용하십시오.

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

결과 분포가 균일에 가깝다는 것을 알 수 있습니다.


0

각 문자를 ASCII 숫자로 변환하고, 모두 곱하여 오버플로를 강제 한 다음 가장 작은 자릿수에서 모듈러스 연산을 수행 할 수 있습니다. 이것이 의사 난수 (pseudo-random)가 아니면 숫자를 조금씩 시프트 할 수 있습니다.

랄프 윈터스


2
곱셈은 ​​최선의 생각이 아닙니다. 특히 초기 오버플로가 보통의 모듈로-모듈로 2의 거듭 제곱 인 경우, 많은 요소가 짝수이므로 대부분의 하위 비트는 0이됩니다. 대신 숫자를 함께 추가하면 이미 훨씬 좋습니다. 더 나은 무작위성이 필요한 경우 일종의 해시 함수 를 사용하고 결과의 비트를 사용하십시오. 다른 사람의 결과에 대해 추측하기 어려운 경우 소금에 절인 강력한 암호화 해시 함수를 사용하십시오.
Erik P.

동의했다. 의사 난수를 생성하기 위해 비트 이동을 설명하는 아이디어를 제안하고 싶었습니다.
랄프 윈터스
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.