runif()
R 과 같은 난수 생성기가 매번 동일한 결과를 생성하지 않는 이유는 무엇 입니까?
예를 들면 다음과 같습니다.
X <- runif(100)
X
매번 다른 출력을 생성합니다.
매번 다른 출력을 생성하는 이유는 무엇입니까?
이를 위해 백그라운드에서 어떤 기능이 진행되고 있습니까?
runif()
R 과 같은 난수 생성기가 매번 동일한 결과를 생성하지 않는 이유는 무엇 입니까?
예를 들면 다음과 같습니다.
X <- runif(100)
X
매번 다른 출력을 생성합니다.
매번 다른 출력을 생성하는 이유는 무엇입니까?
이를 위해 백그라운드에서 어떤 기능이 진행되고 있습니까?
답변:
마음에 이것은 실제로 R 질문이 아닙니다. 더 일반적으로 난수 생성과 관련이 있습니다.
"랜덤"숫자는 통계의 많은 부분에서 매우 중요합니다. 특정 속성을 가지려면 생성 된 난수 값이 필요하며 난수 생성기를 구성하고 속성을 확인하는 데 많은 노력이 필요합니다.
아이디어는 실제로 임의의 숫자에 대한 좋은 프록시 인 일련의 값을 얻고 싶습니다. 난수 생성의 일반적인 주력은 균일 분포입니다 (우리는 가우시안 난수와 같은 다른 것을 구성합니다).
따라서 (가장 일반적으로) 숫자 알고리즘을 사용하여 정수 시퀀스를 구성합니다. 각 정수는 이전 정수의 기능 측면에서 볼 수 있습니다. 그런 다음이 정수는 0과 1 사이 (일반적으로 )로 조정됩니다.
예를 들어, 많은 사람들이 이전 작업을 수행합니다.
... 여기서 는 정수이고 는 단위 간격으로 크기가 조정되며 는 종종 복잡하지만 일반적으로 빠른 비트 함수로 인수의 비트에서 작동하여 새로운 비트 세트를 생성합니다. (희망적으로) 이전 값과 관련 이없는 것처럼 보입니다 (우리가 모든 방식으로, 심지어 신중하게도-값이 실제로 관련되어 있음에도 불구하고 그것이 그렇게 만들어 졌기 때문에). 시퀀스의주기가 매우 길고 값이 실제로 일정하고 실제로 관심을 가질만한 방식으로 순차적으로 종속되지 않도록주의해서 구성해야합니다 (일반적으로 다음과 같은 여러 다른 요구 사항과 함께) 중대한).z f
시작 ( "씨드") 정수 ( )가 필요합니다.이 정수는 제공합니다 (일부 알고리즘에는 둘 이상의 시드가 필요할 수 있음). 동일한 시드를 다시 사용하면 동일한 시퀀스를 얻게됩니다 (결과를 재현하는 데 편리함). 그러나 어떤 경우에는 임의의 숫자를 원하며 시작점이 이전에 사용한 로트와 다른 한 씨앗이 무엇인지 상관하지 않습니다.
따라서 씨앗을 제공하지 않으면 많은 패키지가 당신을 위해 하나를 만들 수 있습니다. 일부 패키지는 내부 디지털 시계의 마지막 몇 자리 숫자 (보통 어떤 방식으로 조작)를 봅니다. 난수 생성기에 의해 다음 시드로 사용하기 위해 생성 된 일부 값 (R 포함)은 마지막 값 ( 위 의 정수 ,보다 일반적으로 "상태"라는 용어는 둘 이상의 숫자가 관련된 경우를 처리하는 데 사용됨)을 저장합니다. 당신이 하나를 공급하지 않으면.
?runif
R을 참조 하면 R에서 ?.Random.seed
사용할 수있는 많은 난수 생성기를 설명하는 도움말 링크가있는 난수 시드의 존재에 대해 설명합니다 (자신의 공급도 가능). 동일한 도움말 페이지에서는 시드 이전에 난수 생성을 사용하지 않았거나 시드를 설정하지 않은 경우 시드로 시작하도록 시계에서 가져온 다음 이전 값이 저장되므로 다음 임의의 숫자가 표시됩니다. 지난번에 또 하나의 가치를 창출했다면 얻을 수있는 것과 같은 것입니다.
runif
R 의 함수 (보통 비슷한 것을 할 수있는 다른 패키지의 다른 난수 생성 루틴처럼)는 난수 시드가 유지되는 위치를 알고 있습니다. 그 값을 계속 업데이트합니다. 따라서 명시 적으로 시드를 전달하지 않고도 작동 할 수 있지만 여전히 시드를 사용합니다. 당신이 그것을주지 않았다면, 그것은 마지막으로 저장 한 것을 사용합니다.
매번 다른 출력을 제공하는 이유에 대해 (동일한 시퀀스를 제공하지 않으면) 매번 동일한 값이 일반적으로 매우 역효과 적이므로 반복되는 속성을 가지지 않기 때문에 이렇게합니다. 랜덤 샘플링은 랜덤 넘버 생성기를 사용하는 putpose에 유용하지 않습니다.
매번 같은 결과를 얻으려면 랜덤 시드 를 설정해야합니다 . 그렇게 하려면 ? 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 함수를 사용하는 이유를 읽으십시오 .