2010-08-18 4 views
14

일부 분포에 따라 난수를 생성하고 싶습니다. 어떻게해야합니까?분포에 따라 난수 생성

+2

컴퓨터가 단지 의사 난수를 생성한다는 사실 외에도, 알려진 배포판에 생성 된 경우 반드시 임의적이지는 않습니다. 어떤 배포판에서 샘플 데이터를 생성하려고합니까? – Lazarus

+0

가장 쉬운 방법은이 작업을 수행하는 라이브러리를 찾는 것입니다. 특정 언어가 염두에 있습니까? –

+0

자바를 사용한다면 난수 생성기, 확률 분포, 결합론 및 통계를 제공하는 [Uncommons Maths 라이브러리 Dan Dyer] (http://maths.uncommons.org/) (* 이전 주석 * 참고)를 시도해 볼 수 있습니다 . – hengxin

답변

15

표준 변형 난수 생성기 (간단한 변환 후 C에서 rand(), 여러 언어로 등가물)는 [0,1] 범위의 균일 분포에 대한 매우 좋은 근사입니다. 그것이 당신이 필요로하는 것이라면, 당신은 끝났습니다. 또한 다소 큰 정수 범위에서 생성 된 난수로 변환하는 것도 쉽습니다.

균일 분포를 정규 분포로 변환하면 already been covered on SO이되고, Exponential distribution이됩니다.

[EDIT] 다음 triangular distribution 들어, 일정한 변수의 변환은 비교적 간단하다 (문제의 형상 C) 단지 위키 페이지의 식으로 변환있어

double triangular(double a,double b,double c) { 
    double U = rand()/(double) RAND_MAX; 
    double F = (c - a)/(b - a); 
    if (U <= F) 
     return a + sqrt(U * (b - a) * (c - a)); 
    else 
     return b - sqrt((1 - U) * (b - a) * (b - c)); 
} 

. 당신이 다른 사람들을 원한다면, 그것은 볼 수있는 곳입니다; 일반적으로 균일 변수를 사용하여 원하는 분포의 cumulative density function 세로 축의 점을 선택하고 (연속이라고 가정) CDF를 반전하여 원하는 분포로 임의의 값을 얻습니다.

+0

아니요, 지수, 일반, 삼각형 등의 숫자가 필요합니다. Rockwell Arena 입력 분석기는이 작업을 수행하지만 사용 방법을 모릅니다. –

+0

+1이 C 의사 코드는 고맙습니다. 삼각형 분포에 관한 위키 백과의 기사를보고 코드로 변환하는 방법을 알 수 없었기 때문입니다. 한가지 수정 : rand()는 0에서 RAND_MAX까지의 정수를 반환하므로'U = ((double) rand())/RAND_MAX'를 원한다고 생각합니다. 그렇지 않으면 sqrt ((1 - U) ...)가 가상으로 나옵니다. – LarsH

+0

@LarsH : 젠장! C가 그렇게 이상하다는 것을 잊어 버렸습니다. 수정 해줘서 고마워. –

3

실제로 배포판에 따라 다릅니다. 가장 일반적인 방법은 다음과 같습니다. 분포에 따라 생성 된 난수가 X보다 작을 확률을 P (X)라고합시다.

0부터 1까지 균일 한 임의의 X를 생성하는 것으로 시작합니다. 그 후에 당신은 P (Y) = X와 Y를 출력하고 Y를 출력합니다. P (X)가 X의 증가 함수이기 때문에 이진 검색을 사용하여 그러한 Y를 찾을 수 있습니다.

이것은 효율적이지는 않지만 P (X)를 효율적으로 계산할 수있는 배포판에서 작동합니다.

9

에게 Devroye하여 책뿐만 아니라 이렇게 올바른 방법 샘플링 샘플링 역변환을 볼 수있는 것은 N-1 이진 분포로 분포를 분해한다. 은 n-1 분포에서 균일하게

1. A/E: 0.20/0.80 
2. B/E: 0.40/0.60 
3. C/E: 0.40/0.60 
4. D/E: 0.80/0.20 

선택하고 기반하여 상기 제 1 또는 제 2 심볼을 선택

A: 0.05 
B: 0.10 
C: 0.10 
D: 0.20 
E: 0.55 

당신은 4 바이너리 배포판으로 변환 :이 같은 유통이있는 경우 즉 확률에 대해 각각 이진 분포에있다.

Code for this is here

+0

배포본이 분리되어 있다고 가정합니다. – pjs

+0

저는 프로그래밍에서 전형적인 경우입니다 (예 : 확률 전이 테이블, 숨겨진 마코프 모델 등). 그러나 당신이 방법을주의하는 경우에 * 일정한 시간 *. 이는 거대한 배포판을 생성 할 때 시간적인 성능상의 불이익이 없다는 것을 의미합니다. 그래서 연속적인 배포를 위해서, 당신은 충분한 근사값을 얻고 나의 방법을 사용하는 데 필요한만큼의 저장소로 그것을 분열시킬 수 있습니다. –

+1

이산 RV는 사용자가 수행하는 프로그래밍에서 가장 일반적 일 수 있지만 많은 사람들이 Gaussian, exponential, triangular, log-normal, beta, gamma, Weibull 등을 배포해야합니다. 불연속 분포가 있더라도 무한 범위 (Poisson, 기하학적)에서는 작동하지 않습니다. 별칭 테이블은 일정 시간 내에 값을 생성하지만 대부분의 연속 반전 또는 합성을 수행합니다. 한편, 테이블을 이용한 근사 연속 분포는 계산 방식에 의해 필요하지 않은 대규모 설정 및 저장 공간을 필요로합니다. 별칭 테이블은 적용 가능할 때 사랑 스럽지만 일반적인 솔루션은 아닙니다. – pjs

0

당신은 보간 더블/떠 분리 쓰레기통에서 변환 할 수 있습니다. 간단한 선형이 잘 작동합니다. 테이블 메모리가 제한되면 다른 보간 방법을 사용할 수 있습니다. -jlp