2011-08-12 13 views
6

私は100秒間毎秒1から50までの数値を擬似ランダムに選んでいると言います。時間がたつにつれて、選択された数値が大きくなる可能性が高くなります。どのように私はそのようなアルゴリズムを構造化できますか?例えば前方に傾いている乱数の確率分布

:10秒後に選んだ数がより大きくなる可能性が高いです。近い1

以上に99秒後に近い50の数を選択する確率がはるかに可能性の高い数を選択するよりも数が9秒

後に選んだ

答えて

4

私はあなたのための簡単な解決策を持っています。代わりにrand(1, 50)の(たとえば、この関数は一様乱数を発生さ1..50)次の式を使用します。

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

これはまだあなたのすべての数字1..50を与えるだろう。 exp = 1の場合、分布は均一になります。 expを少し上げると(たとえば1.1程度)、数値が大きくなる確率が高くなります。 EXPが高いほど、それはあなたが例えばを行うことができます50

に向けて増加します:

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任意のランドのために働くことを確認確率は依然として均一でステップ毎に均一です(1を選ぶ確率は50と同じですが、50を超える数を取り除いても同じです)。それとも私は何かをやっている? –

+0

ありがとう、私の答えを改訂しました。 –

+0

私は、凹関数がiと一緒に進化する必要があると信じています。そうでなければ、確率分布は常に同じです。あなたはrandomnum int(50 * pow(rand()、1/i)を使うことができます。 –

0

おそらくもっと簡単な方法がありますが、一般的な解決策はinverse transform samplingです。基本的に

、あなたが与えられたPDFで乱数を生成したい場合は、P(X)、最初P '、逆累積密度関数(CDF)を計算(x)の。 0と1の間の一様乱数を生成し、P '(x)をそれらに適用することができます。

5

は、[(所望の間隔に、[0,1]の間の乱数を生成し1に0と1と0をマッピング平方根のような任意の凹の単調関数を選んで関数を適用し、次いでscretch [0,1] 1,50])。

ここで、f(x)= xを線形変換から前述の変換関数に変形すると、たとえば単純な重み付けを行うと、目的の効果が得られます。

+0

+1、これは興味深いアプローチです。 –

+0

@yi_H私は完全に理解しているかわかりません。しかし、あなたの機能は毎秒変わる必要があります。例f(i、x)= pow(x、1/i)とすると、f(x)= x、f(x)= sqrtそれはあなたが望むことをします。 1秒間に1つの関数を使用することはできません(そうしないと、増加する理由がない可能性があります)。右 ? –

+0

はい、あなたは一連の機能を使うことができます。 f(x)=(1-i)x + i sqrt(x)ここで、iは0から1になる。 –

関連する問題