2011-12-03 6 views
1

ある一般的な範囲でゼロに近い数値を生成したいと思います。たとえば、数字を時間の10%未満にしたいとしますが、15,20、または30になる可能性はわずかです。数値が高いほど、それを受け取る機会は少なくなります。ゼロに近い乱数を生成するにはどうすればよいですか?

「重み付き確率」というキーワードで何かを探してみましたが、正しい方向につながっているものは見つかりませんでした。


更新:

私はボックス・ミュラー変換(受け入れ答えを参照)を使用して終了。

const E = 2.71828183; 

function getRandomCurvedValue(temp.median, temp.density) { 
    return this.getCurvedValue(random(0, 1), temp.median, temp.density); 
} 

function getCurvedValue(temp.value, temp.median, temp.density) { 
    return temp.median + (temp.density * log(E, (temp.value/(1 - temp.value)))); 
} 
+0

整数を生成していますか? http://stackoverflow.com/questions/1761626/weighted-random-numbers。 -10は有効な出力ですか? –

+0

より具体的でなければなりません。おそらく、適切な 'pdf'を選択することによって可能になります。 – AraK

+0

あなたの番号はどのように配布しますか?それが時間の90%未満になる唯一の要件ですか? – James

答えて

5

私はあなたがnormal distributionを探していると思う:ここで私が書いた簡単なコードです。平均値と標準偏差:

正規分布は、変更可能な2つの変数を持っています。あなたのケースでは平均値は0になり、値の90%が10未満になるように標準偏差が適切に選択されます(Wikipediaの記事の表に基づいて、1.645の標準偏差が適切であると私は考える)。

You均等に分散されたものから正規分布のランダム値を生成する簡単な方法としてBox-Muller transformを使用することができます。また、[0、∞]の範囲の値しか必要ないので、結果の絶対値を使用する必要があります。

+0

これは完璧です、ありがとう!私は私の質問の最後に使用したコードを追加しました。 –

+0

ニースの答え;偉大なグラフ。 – duffymo

0

1つの可能性は、(各反復ごとに)乱数のセットを生成することである。これらの数字の最小値が生成された数値として選択されます。

明らかに、選択する数字が多いほど、最小数が小さくなる可能性が高くなります。

例:9と10の2つの乱数を生成するとします。9が選択されているため、最小です。

あなたのセットに9,10,11、および8の4つの乱数を生成するとします.8が選択されているとします。この方法でも

、私はあなたが右に理解していれば、あなたは数字を選んで、そこからの範囲、1から100まで言って...(これは制限要因の一種である)

3

を持っていることが重要です正の乱数のみが必要です。この場合、たとえばexponentially distributed random numbersを使用できます。この分布には単一のパラメータλがあります。 「数値が時間の10 90%未満になるようにする」場合、ラムダは-ln(0.1)/10と計算されます(ここではlnは自然対数です)。一般に、確率pでx以下になるようにするには、lambda = -ln(1 - p)/x(あなたの例では、p = 0.9とx = 10)。与えられたλパラメータで指数分布乱数を簡単に生成することができます。-ln(1 - rand())/lambda関数rand()は、0と1の間で均等に分散した乱数を生成する関数です。

+0

実際、指数関数も働いています。 – Joey

関連する問題