runif가 매번 같은 결과를 생성하지 않는 이유는 무엇입니까?


11

runif()R 과 같은 난수 생성기가 매번 동일한 결과를 생성하지 않는 이유는 무엇 입니까?

예를 들면 다음과 같습니다.

X <- runif(100)
X

매번 다른 출력을 생성합니다.

매번 다른 출력을 생성하는 이유는 무엇입니까?

이를 위해 백그라운드에서 어떤 기능이 진행되고 있습니까?


3
이것을 생각하는 한 가지 방법은 스스로에게 물어 보는 것입니다 : "난수 생성기가 매번 같은 숫자를 생성하길 원하십니까?"
shadowtalker

2
@ ssdecontrol : 참조 Dilbert
헨리

2
또는 xkcd
Henry

답변:


18

마음에 이것은 실제로 R 질문이 아닙니다. 더 일반적으로 난수 생성과 관련이 있습니다.

"랜덤"숫자는 통계의 많은 부분에서 매우 중요합니다. 특정 속성을 가지려면 생성 된 난수 값이 필요하며 난수 생성기를 구성하고 속성을 확인하는 데 많은 노력이 필요합니다.

아이디어는 실제로 임의의 숫자에 대한 좋은 프록시 인 일련의 값을 얻고 싶습니다. 난수 생성의 일반적인 주력은 균일 분포입니다 (우리는 가우시안 난수와 같은 다른 것을 구성합니다).

따라서 (가장 일반적으로) 숫자 알고리즘을 사용하여 정수 시퀀스를 구성합니다. 각 정수는 이전 정수의 기능 측면에서 볼 수 있습니다. 그런 다음이 정수는 0과 1 사이 (일반적으로 )로 조정됩니다.[0,1)

예를 들어, 많은 사람들이 이전 작업을 수행합니다.

엑스1=에프(엑스0)1=엑스1/미디엄엑스2=에프(엑스1)2=엑스2/미디엄엑스=에프(엑스2)=엑스/미디엄

... 여기서 는 정수이고 는 단위 간격으로 크기가 조정되며 는 종종 복잡하지만 일반적으로 빠른 비트 함수로 인수의 비트에서 작동하여 새로운 비트 세트를 생성합니다. (희망적으로) 이전 값과 관련 이없는 것처럼 보입니다 (우리가 모든 방식으로, 심지어 신중하게도-값이 실제로 관련되어 있음에도 불구하고 그것이 그렇게 만들어 졌기 때문에). 시퀀스의주기가 매우 길고 값이 실제로 일정하고 실제로 관심을 가질만한 방식으로 순차적으로 종속되지 않도록주의해서 구성해야합니다 (일반적으로 다음과 같은 여러 다른 요구 사항과 함께) 중대한).z f엑스에프

시작 ( "씨드") 정수 ( )가 필요합니다.이 정수는 제공합니다 (일부 알고리즘에는 둘 이상의 시드가 필요할 수 있음). 동일한 시드를 다시 사용하면 동일한 시퀀스를 얻게됩니다 (결과를 재현하는 데 편리함). 그러나 어떤 경우에는 임의의 숫자를 원하며 시작점이 이전에 사용한 로트와 다른 한 씨앗이 무엇인지 상관하지 않습니다.엑스0

따라서 씨앗을 제공하지 않으면 많은 패키지가 당신을 위해 하나를 만들 수 있습니다. 일부 패키지는 내부 디지털 시계의 마지막 몇 자리 숫자 (보통 어떤 방식으로 조작)를 봅니다. 난수 생성기에 의해 다음 시드로 사용하기 위해 생성 된 일부 값 (R 포함)은 마지막 값 ( 위 의 정수 ,보다 일반적으로 "상태"라는 용어는 둘 이상의 숫자가 관련된 경우를 처리하는 데 사용됨)을 저장합니다. 당신이 하나를 공급하지 않으면.엑스

?runifR을 참조 하면 R에서 ?.Random.seed사용할 수있는 많은 난수 생성기를 설명하는 도움말 링크가있는 난수 시드의 존재에 대해 설명합니다 (자신의 공급도 가능). 동일한 도움말 페이지에서는 시드 이전에 난수 생성을 사용하지 않았거나 시드를 설정하지 않은 경우 시드로 시작하도록 시계에서 가져온 다음 이전 값이 저장되므로 다음 임의의 숫자가 표시됩니다. 지난번에 또 하나의 가치를 창출했다면 얻을 수있는 것과 같은 것입니다.

runifR 의 함수 (보통 비슷한 것을 할 수있는 다른 패키지의 다른 난수 생성 루틴처럼)는 난수 시드가 유지되는 위치를 알고 있습니다. 그 값을 계속 업데이트합니다. 따라서 명시 적으로 시드를 전달하지 않고도 작동 할 수 있지만 여전히 시드를 사용합니다. 당신이 그것을주지 않았다면, 그것은 마지막으로 저장 한 것을 사용합니다.

매번 다른 출력을 제공하는 이유에 대해 (동일한 시퀀스를 제공하지 않으면) 매번 동일한 값이 일반적으로 매우 역효과 적이므로 반복되는 속성을 가지지 않기 때문에 이렇게합니다. 랜덤 샘플링은 랜덤 넘버 생성기를 사용하는 putpose에 유용하지 않습니다.


14

매번 같은 결과를 얻으려면 랜덤 시드 를 설정해야합니다 . 그렇게 하려면 ? set.seed 를 사용하십시오 . 치다:

> runif(1)
[1] 0.6467259
> runif(1)
[1] 0.2101857
> set.seed(1)
> runif(1)
[1] 0.2655087
> set.seed(1)
> runif(1)
[1] 0.2655087

set.seed 함수를 사용하는 이유를 읽으십시오 .


3
이것은 일련의 결과를 재생하는 메커니즘을 설명하지만, 질문 자체를 다루지 않는 것 같습니다. 왜 이런 종류의 행동이 자동이 아닌지 궁금합니다.
whuber

@ whuber, 나는 질문이 원격 주제에 관한 것이 아니라고 생각합니다. 나는 즉시 문을 닫고 그 특권이 있다면 바로 문을 닫았을 것이다. OP를 비우지 않도록 이것을 게시했습니다.
gung-모니 티 복원

매번 "set.seed (1)"를 실행하십시오.
Nip
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.