2009-06-03 18 views
3

数日前、you helped me to find out an algorithm for generating random strength values in an online game (thx especially John Rasch)ランダム強度値を生成するアルゴリズムを調整する

function getRandomStrength($quality) { 
    $rand = mt_rand()/mt_getrandmax(); 
    $value = round(pow(M_E, ($rand - 1.033)/-0.45), 1); 
    return $value; 
} 

この関数は、1.1と9.9の間の値を生成します。今度は、この関数を同じ確率の値を与えるように調整したいと思いますが、別の間隔で値を与えます。 1.5〜8.0。追加パラメータでこれを達成できるのであれば完璧です。

あなたが私を助けることができれば幸いです。前もって感謝します!

答えて

5

元のコードの1.033と-0.45の値は、スケール1.1〜9.9を提供するマジックナンバーです。次のコードで、パラメータ$low$highとして1.1と9.9を渡すと、同じ結果が得られます。

function getRandomStrength($low, $high) { 
    // TODO: validate the input 
    $ln_low = log($low, M_E); 
    $ln_high = log($high, M_E); 
    $scale = $ln_high - $ln_low; 

    $rand = (mt_rand()/mt_getrandmax()) * $scale + $ln_low; 
    $value = round(pow(M_E, $rand), 1); 
    return $value; 
} 

あなたは$low$highのために任意の範囲を渡して、その範囲内の対数分布を得ることができる必要があります。 (私はあなたにチェック範囲の妥当性を残しておきますが、0 < $low < $highは真でなければなりません。)バックによるこの作品

を提供する範囲で、対数スケールを生成するために必要なリニアスケールを計算します。たとえば、ログスケールを1.1〜9.9にしたい場合は、これらの値のそれぞれの自然対数を取って、私に0.0953〜2.2925を与えます。私はこのの範囲の乱数をの範囲で生成し、乱数をeに上げてログの範囲に戻します。

+0

ありがとう、これはジェイコブBとほとんど同じですね。私は50,000回の実行で両方のアルゴリズムをテストし、Jacob Bのアルゴリズムは少し速かった(0.563871860504対0.468094348907)。 – caw

+0

+1 - 優秀! –

+0

@John Rasch:このコードのどの部分がJacob Bのコードよりも優れていますか? – caw

2

スケール正規化範囲内分布を変位:

D(a,b) = (D(0,1)*(b-a))+a 

を、逆の操作を行い(D、C)は、元の関数Dからの第1のD(0,1)を取得する:

D(0,1) = (D(c,d)-c)/(d-c) 
あなたのケースで

は、Dは、元の関数(指数関数)、aは1.5であり、bが8.5、cが1.1であり、dは9.9

+0

申し訳ありませんが、これは完全にわかりません。もう少し説明していただけますか?ジェイコブBのアプローチよりも複雑なようですね。全体の関数項に他の値(D *数)を掛けていますか? – caw

+0

この例を理解するための鍵は、Dは実際には関数ではなく、統計分布(Uniform、Exponential、何でもよい...)であるということです。私はそれを簡単にしようとする用語を混ぜたが、多分私は間違っていた。-s – fortran

3

一つの方法は、単に値をスケーリングすることである。

function getRandomStrength($quality,$min,$max) { 
    $rand = mt_rand()/mt_getrandmax(); 
    $value = round(pow(M_E, ($rand - 1.033)/-0.45), 1); 
    $value = $value - 1.1 
    $value = $value * ((max-min)/8.8) 
    $value = $value + $min 
    return $value; 
} 
+0

ありがとう。私は少しあなたのコードを調整しました(いくつかの過ち)。今これは正しいですか? http://paste.bradleygill.com/index.php?paste_id=9919 – caw

関連する問題