2011-08-12 6 views
6

나는 1 초당 50에서 100 초 동안 임의로 숫자를 선택하고 시간이 갈수록 선택된 숫자가 더 커질 가능성이 높다고 말합니다. 그런 알고리즘을 어떻게 구조화 할 수 있을까요? 예를 들어앞으로 기울어 진 난수의 확률 분포

: 수가 10 초보다 더 클 가능성이 후 고른 : 가까이 내지 50의 숫자를 선택하는 확률이 훨씬 더 가능성이 가까운 1.

하거나 다수의 선택보다 99 초 후에 수 구초

후 집어

답변

4

나는 당신을위한 간단한 해결책이 있습니다.

power(rand(1, power(50, exp)), 1/exp) 

이 여전히 당신에게 모든 숫자 1..50을 줄 것이다 대신 rand(1, 50)의이 표현을 사용 (예를 들어이 기능은 임의의 숫자를 균일하게 1..50를 생성). exp = 1의 경우 분포가 균일합니다. exp를 약간 늘리면 (예 : 1.1 정도) 큰 숫자를 얻을 확률이 높아집니다.

factor = 1 /* finetune this for your needs */ 
for second = 0..100 
    exp = 1 + (second/100) * factor 
    rand_num = power(rand(1, power(50, exp)), 1/exp) 
endfor 
1

의사 코드 :

let i = 0 
let n = 50 // Adjust for your needs 
for i goes to 100 { 
    randomnum = int(sqrt(rand(1, 50*n))); 
} 

이 매우 앞으로 기대는 할 수 있지만, 그것을 접근하는 하나의 방법입니다.

내 기존 접근 방식의 근본적인 문제를 지적 해 준 Ricky Bobby에게 감사드립니다. 이것은 sqrt와 같은 함수를 사용하는 yi_H의 제안에서 영감을 얻었습니다.

+0

그것은 랜드가 균일 확률 단계 각각이다 function.if있는 랜드 작동하지 않도록 여전히 균일 : 높은 특급, 더는 그래서 당신은 예를 들어, 할 수있는 50

으로 증가 할 것 (1을 따기의 확율은 당신이 50 이상 수를 제거하더라도 50와 동일 인 51와 동일하다). 아니면 뭔가 궁금해하니? –

+0

고마워, 내 대답을 개정. –

+0

나는 오목 함수가 i와 함께 진화 할 필요가 있다고 믿는다. 그렇지 않으면 확률 분포는 항상 동일하다. 당신은 randomnum int (50 * pow (rand(), 1/i)를 사용할 수 있습니다. –

0

아마도 당신이하는 일에 대해 더 간단한 방법이있을 수 있지만 일반적인 해결책은 inverse transform sampling을 사용하는 것입니다. 주어진 PDF와 난수를 생성하려면

본질적, P (x)가 먼저 역 누적 밀도 함수 (CDF), P '을 계산 (X)한다. 그런 다음 0과 1 사이의 균일 한 난수를 생성 한 다음 P '(x)을 적용 할 수 있습니다.

5

0에서 0과 1에서 1을 매핑하는 제곱근과 같은 모든 오목 모노톤 함수를 선택합니다. [0,1] 사이에 임의의 숫자를 생성하고 함수를 적용한 다음 [0,1]을 원하는 간격 ([ 1,50]).

이제 선형 변환 f (x) = x에서 예를 들어 간단한 가중치를 사용하여 언급 한 변환 함수로 변형하면 원하는 효과를 얻을 수 있습니다.

+0

+1, 이것은 흥미로운 접근 방법입니다. –

+0

@yi_H 완전히 이해하고 있는지 잘 모르겠습니다. 그러나 귀하의 기능은 매초마다 변경해야합니다. 예를 들어 함수 f (i, x) = pow (x, 1/i)의 serie를 취하고, z (x) = x 다음에 f (x) = sqrt그리고 그것은 당신이 원하는 것을합니다. 모든 초 동안 하나의 기능을 고수 할 수는 없습니다 (증가 할 이유가없는 확률). 권리 ? –

+0

예, 일련의 기능을 사용할 수 있습니다. f (x) = (1-i) x + i sqrt (x) 여기서 i는 0에서 1로 간다. –