2009-06-10 2 views
6

비 균일 난수 생성 방법을 알려주시겠습니까?
Java를 사용하고 있지만 코드 예제는 원하는대로 지정할 수 있습니다.비 균일 난수 생성

하나의 방법은 2 개의 균일 한 난수를 함께 추가하여 (즉, 2 개의 주사위를 굴려서) 비뚤어진 분포를 만드는 것입니다.

+0

원하는 배포판에 따라 다릅니다. –

답변

6

어떤 편향 분포가 원하는가요?

항상 작동하는 기술이지만 항상 가장 효율적인 것은 아닙니다. 누적 분포 함수 P (x)는 값이 x 아래로 떨어지는 시간의 비율을 나타냅니다. 따라서 x의 가능한 가장 낮은 값에서 P (x) = 0이고 x의 가능한 가장 높은 값에서 P (x) = 1. 모든 분포는 P (x)가 0에서 1로 증가하는 방식으로 분포의 모든 속성을 인코딩하는 고유 한 CDF를가집니다. y가 간격 [0,1]에서 균일 한 편차라면 P (x) = y는 배포본에 따라 배포 될 것입니다. 이 작업을 성공적으로 수행하려면 배포판에 P (x)의 역함수를 계산하는 방법 만 있으면됩니다.

Meta.Numerics 라이브러리 정의 distrubtions 일반적으로 사용되는 다수의 (예를 들면 통상, 로그 정규, 지수, 치 등 제곱)하여 CDF (Distribution.LeftProbability) 및 역 CDF를 계산하는 기능을 갖는다 (Distribution.InverseLeftProbability) 각각의

특수한 기술을 신속하게 처리 할 수있는 특수 기술의 경우. Normaly 분산 분포에 대한 Box-Muller 기법은 책 Numerical Recipies를 참조하십시오.

+0

다른 배포판에서 숫자를 생성하는 방법을 찾고 있었지만 상관 없습니다. 나는 그것이 그렇게 멀리 생각하지 않았다고 생각한다. 더 읽을 거리가 필요한 것 같아요, 그게 당신이 말한 책인가요? Numerical Recipes 제 3 판 : 과학 컴퓨팅 기술 –

+0

예, 그 책입니다. 수치 컴퓨팅에 대한 표준 소개지만 돈과 노력의 큰 투자입니다. 망할 놈을 그냥 원한다면 도서관에 붙어있을거야. 언급 한 것을 사용하면 다음과 같이 간단합니다. 임의의 rng = 새 임의 (1); 배포 dist = 새 NormalDistribution (1.0,2.0); double x = dist.InverseLeftProbability (rng.NextDouble()); –

+0

끝내주는, 이것은 내가 더 잘하고 싶어하는 무엇인가이다. 나는 책을 체크 아웃 할 계획이다. 고맙습니다. –

10

균등하게 분포 된 난수를 생성 한 다음 역상이 아닌 균일 한 cumulative distribution function을 각각에 적용 해 봅니다.

+2

+1 이렇게하는 방법입니다. – ralphtheninja

+0

틀린, 당신은 당신의 분배 기능을 반전해야합니다. 제곱 분포를 원한다면, 난수의 제곱근을 취해야합니다. – glmxndr

+0

저는 배포 함수가 적절한 반전을 적용한다고 가정합니다. 귀하의 문제는 사용 된 기능에 대한 배포 유형의 용어에 더 가깝다고 생각합니다. –

1

Java를 사용하는 경우 내 Uncommons Maths 라이브러리가 중요 할 수 있습니다. 여기에는 Uniform, Gaussian, Poisson, Binomial 및 Exponential 분포에 대한 난수 생성을위한 클래스가 포함됩니다. This article은 이러한 배포판을 사용하는 방법을 보여줍니다.