나는 일반적인 Google 검색 등을 시도했지만 내가 찾은 대부분의 답변은 Python 또는 C ++과 같은 다소 모호하거나 언어 / 라이브러리에 고유 stdlib.h
합니다. 라이브러리의 특성이 아닌 언어에 구애받지 않고 수학적인 답을 찾고 있습니다.
예를 들어, 시드는 난수 생성기의 시작점 이며 동일한 시드는 항상 동일한 난수를 생성 한다고 말합니다 . 무슨 뜻이에요? 출력 번호가 특정 시드의 결정 론적 기능이며 시드의 값에서 임의성이 나온다는 의미입니까? 그러나 만약 그렇다면, 시드를 공급함으로써 우리 프로그래머는 기계가 아닌 것을 무작위로 만드는 것이 아닌가?
또한 이 맥락에서 출발점이 무엇을 의미합니까? 이것은 맵 도메인의 요소를 말하는 엄격한 방법 입니까? 아니면 뭔가 잘못되고 있습니까? f : X → Y
x∈Xf:X→Y
답변
대부분의 의사 난수 생성기 (PRNG) 는 “시드”라는 입력에 의해 결정되는 기본 값에서 시작하는 일종의 재귀 방법과 관련된 알고리즘을 기반으로합니다. 대부분의 통계 소프트웨어 (R, Python, Stata 등)의 기본 PRNG는 Matsumoto 및 Nishimura (1998) 에 설정된 Mersenne Twister 알고리즘 MT19937 입니다. 이것은 복잡한 알고리즘이므로 작동 방식을 자세히 알고 싶다면 논문을 읽는 것이 가장 좋습니다. 이 특정 알고리즘에는 차수 n 의 반복 관계 가 있으며 입력 시드는 벡터 x 0 , x 1 , 의 초기 집합입니다 . . . ,
n. 이 알고리즘은 다음을 생성하는 선형 재귀 관계를 사용합니다.
x0,x1,...,xn−1
r A
1⩽m⩽nr
A
이제 MT19937 알고리즘을 사용하는 것은 단지 하나의 예일뿐입니다. 통계 소프트웨어에 사용할 수있는 많은 PRNG가 있으며 각각 다른 재귀 방법을 사용하므로 시드는 기술 용어로 각기 다른 의미를 갖습니다. 이 문서R
에서 PRNG 라이브러리를 찾을 수 있습니다.이 라이브러리 에는 사용 가능한 알고리즘과 이러한 알고리즘을 설명하는 논문이 나와 있습니다.
시드의 목적은 사용자가 의사 난수 생성기를 “잠글”수 있도록하여 복제 가능한 분석을 가능하게하는 것입니다. 일부 분석가는 하드웨어 입력을 사용하여 초기 시드 번호를 생성하는 TRNG (참 난수 생성기) 를 사용 하여 시드를 설정 한 다음이를 잠긴 숫자로보고하려고합니다. 시드가 원래 사용자에 의해 설정되고보고되면 감사자는 분석을 반복하고 원래 사용자와 동일한 의사 난수 시퀀스를 얻을 수 있습니다. 시드가 설정되지 않은 경우 알고리즘은 일반적으로 (예를 들어 시스템 시계에서) 일종의 기본 시드를 사용하며 일반적으로 무작위 화를 복제 할 수 없습니다.
답변
첫째, 오늘날의 컴퓨터에서 “무작위 숫자”를 생성 한 경우에는 무작위성 이 없습니다 . 모든 의사 난수 발생기는 결정 론적 방법을 사용합니다. (아마도, 양자 컴퓨터가 그것을 바꿀 것입니다.)
어려운 작업은 실제로 임의의 소스에서 오는 데이터와 의미를 구분할 수없는 출력을 생성하는 알고리즘을 고안하는 것입니다.
시드를 설정하면 의사 난수의 긴 목록에서 특정 알려진 시작 지점에서 시작하는 것이 옳습니다. R, Python 등으로 구현 된 생성기의 경우 목록이 매우 깁니다. 가장 큰 실현 가능한 시뮬레이션 프로젝트조차도 발전기의 ‘기간’을 초과하지 않아 값이 다시 순환되기 시작할 정도로 충분히 길다.
많은 일반적인 응용에서 사람들은 씨앗을 설정하지 않습니다. 그런 다음 예측할 수없는 시드가 자동으로 선택됩니다 (예 : 운영 체제 시계의 마이크로 초). 의사 난수 발생기는 일반적으로 테스트 배터리에 적용되었으며, 초기 불만족스러운 생성기로 시뮬레이션하기 어려운 문제로 구성되었습니다.
일반적으로 생성기의 출력은 실제 목적 상 의 균일 분포에서 무작위로 선택한 숫자와 구별 할 수없는 값으로 구성됩니다그런 다음 의사 난수는 조작되므로 이항, 포아송, 정규, 지수 등과 같은 다른 분포에서 무작위로 샘플링하는 것과 일치합니다.
(0,1).발전기의 한 가지 테스트는 로 시뮬레이션 된 ‘관측’의 연속 쌍이
실제로 단위 사각형을 무작위로 채우는 것처럼 보이는지 확인하는 것입니다. (아래 두 번 수행) 약간의 대리석 모양은 고유 한 가변성의 결과입니다. 완벽하게 균일하게 회색으로 보이는 줄거리를 얻는 것은 매우 의심 스러울 것입니다. [일부 해상도에서는 규칙적인 무아레 패턴이있을 수 있습니다. 그 위조 효과가 발생하지 않게하려면 확대를 위 또는 아래로 변경하십시오.]
set.seed(1776); m = 50000
par(mfrow=c(1,2))
u = runif(m); plot(u[1:(m-1)], u[2:m], pch=".")
u = runif(m); plot(u[1:(m-1)], u[2:m], pch=".")
par(mfrow=c(1,1))
종자를 설정하는 것이 때때로 유용합니다. 이러한 용도는 다음과 같습니다.
-
프로그래밍 및 디버깅 할 때 예측 가능한 출력을 갖는 것이 편리합니다. 많은 프로그래머들이 프로그램
set.seed
의 시작 부분에 쓰기와 디버깅이 끝날 때까지 진술을합니다. -
시뮬레이션에 관해 가르 칠 때. 학생들에게
sample
R 의 함수를 사용하여 공정한 주사위 굴림을 시뮬레이션 할 수 있음을 보여주고 싶다면 속임수를 사용하여 많은 시뮬레이션을 실행하고 목표 이론적 값에 가장 가까운 것을 선택할 수 있습니다 . 그러나 이것은 시뮬레이션이 실제로 어떻게 작동하는지에 대한 비현실적인 인상을 줄 것입니다.시작시 시드를 설정하면 매번 시뮬레이션이 동일한 결과를 얻습니다. 학생들은 본인의 프로그램 사본을 교정하여 의도 한 결과를 얻을 수 있습니다. 그런 다음 자체 씨앗을 사용하거나 프로그램이 자체 시작 위치를 선택하도록하여 자체 시뮬레이션을 실행할 수 있습니다.
예를 들어, 두 개의 공정한 주사위를 굴릴 때 총 10을 얻을 확률은백만 번의 2 회 주사위 실험으로 2 ~ 3 곳 정도의 정확도를 얻을 수 있습니다. 시뮬레이션 오차의 95 % 마진은 약2 √
3/36=1/12=0.08333333.2(1/12)(11/12)/106=0.00055.set.seed(703); m = 10^6 s = replicate( m, sum(sample(1:6, 2, rep=T)) ) mean(s == 10) [1] 0.083456 # aprx 1/12 = 0.0833 2*sd(s == 10)/sqrt(m) [1] 0.0005531408 # aprx 95% marg of sim err.
-
시뮬레이션과 관련된 통계 분석을 공유 할 때.
오늘날 많은 통계 분석에는 순열 테스트 또는 Gibbs 샘플러와 같은 일부 시뮬레이션이 포함됩니다. 시드를 표시하면 분석을 읽는 사람들이 원하는 경우 결과를 정확하게 복제 할 수 있습니다. -
무작위 화와 관련된 학술 기사를 작성할 때. 학술 기사는 보통 여러 차례의 동료 심사를 거칩니다. 플롯은, 예를 들어, 과도 플로팅을 감소시키기 위해 랜덤 지터 포인트를 사용할 수있다. 검토 자 의견에 대한 응답으로 분석을 약간 변경해야하는 경우, 특정 관련 지 터링이 검토 라운드간에 변경되지 않는 것이 좋으며, 이는 특히 nitpicky 검토 자에게는 당황 스러울 수 있으므로 지터 전에 시드를 설정합니다.
답변
TL; DR;
시드는 일반적으로 난수 시퀀스를 재현 할 수있게합니다. 그런 의미에서 그것들은 진정한 난수가 아니라 “의사 난수”이므로 PNR 생성기 (PNRG)입니다. 이들은 실제 생활에서 실제로 도움이됩니다!
조금 더 자세히 :
컴퓨터 언어로 구현 된 거의 모든 “임의”숫자 생성기는 의사 난수 생성기입니다. 시작 값 (===> 시드)이 주어지면 항상 동일한 시퀀스의 유사 무작위 결과를 제공하기 때문입니다. 좋은 제너레이터는 통계 용어로 진정한 무작위 시퀀스와 구별 할 수없는 시퀀스를 생성합니다 (트루 다이, 실제 코인 등 던지기 등).
많은 시뮬레이션 사례에서 진정한 “무작위”경험을 원합니다. 그러나 결과를 재현 할 수도 있습니다. 왜? 글쎄, 적어도 규제 당국은 그 독특한 것에 관심이 있습니다.
다이빙 할 것이 많습니다. 사람들은 심지어 “최고의”랜덤 시드로 분석을합니다. 내 생각에 이것은 “true”랜덤 행동을 처리 할 수 없거나 PRNG가 구현에 적합하지 않기 때문에 모델을 무효화합니다. 대부분의 경우 시뮬레이션을 충분히 수행하지 못하지만 시간이 걸립니다.
이제 “진정한”RNG를 상상해보십시오. 기계에서 임의의 종류에 따라이를 구현할 수 있습니다. 임의의 시드 만 사용하는 경우 (예 : 지금 시간) 임의의 시작점을 만들지 만 시퀀스의 임의성은 여전히 다음 숫자를 결정하는 알고리즘에 따라 다릅니다. 결과 분포에 따라 실제 “결과”가 결정되므로 대부분의 경우 시작점보다 더 중요합니다. 시퀀스가 실제로 임의적이어야한다면 어떻게 구현할 것입니까? 컴퓨터의 클럭 틱은 결정 론적이라고 할 수 있으며 그렇지 않으면 아마도 많은 자동 상관 관계를 보여줄 것입니다. 그래서 당신은 무엇을 할 수 있습니까? 지금까지 가장 좋은 방법은 견고한 PNRG를 구현하는 것입니다.
양자 컴퓨팅? 그게 고칠 지 모르겠습니다.