첫 번째 알고리즘 은 두 가지 이유로 잘못 실패합니다 .
의 바닥을 취하면 크게 줄일 수 있습니다. 실제로 b - a < n 일 때 0이되어 값이 모두 같은 집합을 제공합니다!( a − b ) / nb - a < n
바닥을 잡지 않으면 결과 값이 너무 고르게 분포됩니다. 예를 들어, 임의의 단순 무작위 추출법에 IID 균일 (사이 말 variates = 0 및 B = 1 , 거기이다) ( 1 - 1 / N ) N ≈ 1 / E ≈ 37 %의 최대는 않을 것이라는 가능성 에서 상부 구간 1 - 1 / N 에 1 . 알고리즘 1을 사용하면 100 %엔a = 0b = 1( 1 - 1 / N )엔≈ 1 / e ≈ 37 %1 − 1 / n1100 %최대가 그 간격에있을 가능성이 있습니다. 어떤 목적을 위해이 초 균일 성은 좋지만, 일반적으로 (a) 많은 통계가 망가질 수 있지만 (b) 이유를 결정하기가 매우 어려워서 끔찍한 오류입니다.
정렬을 피하려면 대신 독립 지수 분포 변수를 생성하십시오. 합을 나눔으로써 누적 합을 범위 ( 0 , 1 ) 로 정규화 하십시오. 가장 큰 값을 삭제하십시오 (항상 1 ). 범위 ( a , b )로 재조정하십시오 .n + 1( 0 , 1 )1( a , b )
세 가지 알고리즘의 히스토그램이 표시됩니다. (각각 독립적 인 n = 100 값 집합의 누적 결과를 보여줍니다 .) 알고리즘 1에 대한 히스토그램에 눈에 띄는 변화가 없다는 것이 문제를 보여줍니다. 다른 두 알고리즘의 변형은 정확히 예상되는 것과 난수 생성기에서 필요한 것입니다.1000n = 100
독립적 인 균일 변량을 시뮬레이션하는 더 많은 (재미있는) 방법 은 정규 분포의 드로우를 사용하여 균일 분포에서 드로우 시뮬레이션을 참조하십시오 .
R
그림을 생성 한 코드 는 다음과 같습니다 .
b <- 1
a <- 0
n <- 100
n.iter <- 1e3
offset <- (b-a)/n
as <- seq(a, by=offset, length.out=n)
sim.1 <- matrix(runif(n.iter*n, as, as+offset), nrow=n)
sim.2 <- apply(matrix(runif(n.iter*n, a, b), nrow=n), 2, sort)
sim.3 <- apply(matrix(rexp(n.iter*(n+1)), nrow=n+1), 2, function(x) {
a + (b-a) * cumsum(x)[-(n+1)] / sum(x)
})
par(mfrow=c(1,3))
hist(sim.1, main="Algorithm 1")
hist(sim.2, main="Algorithm 2")
hist(sim.3, main="Exponential")
R
. 균일 한 간격 에서 난수 로 구성된 개의 배열을 생성하기 위해 다음 코드가 작동합니다 . n [ a , b ]rand_array <- replicate(k, sort(runif(n, a, b))