1

私がやろうとしているのは、最小値と最大値が有限であるため、正確にはガウス分布ではありません。この考え方は、X サイコロを振って合計を数えることに近いものです。

現在、次の機能があります。

function bellcurve($min=0,$max=100,$entropy=-1) {
    $sum = 0;
    if( $entropy < 0) $entropy = ($max-$min)/15;
    for($i=0; $i<$entropy; $i++) $sum += rand(0,15);
    return floor($sum/(15*$entropy)*($max-$min)+$min);
}

変数の背後にある考え方$entropyは、分数の結果がより均等に分布するように十分な数のサイコロを振って試行することです (フローリングが問題を引き起こさないようにするため)。

完璧な RNG である必要はありません。ゲーム機能のためだけのものであり、ギャンブルや暗号化のようなものではありません。

bellcurve()しかし、引数なしで の65,536 回の繰り返しテストを実行したところ、次のグラフが表示されました: (出典: adamhaskell.net )
グラフ

ご覧のとおり、「オフセット」された値がいくつかあり、大幅にオフセットされています。全体的にはそれほど影響はありませんが (最悪の場合は 2 相殺され、希望する確率が多かれ少なかれあることを無視します)、どこで間違ったのか疑問に思っています。

この機能に関する追加のアドバイスもいただければ幸いです。

更新: のround代わりにを使用するだけで上記の問題を修正しましたfloorが、これに適した関数を取得するのにまだ問題があります。ガウス、指数、ロジスティックなど、考えられるほとんどすべての関数を試しましたが、役に立ちませんでした。これまでに機能した唯一の方法は、サイコロを転がすことのこの近似値です。これは、私が必要としているものではないことはほぼ確実です...

4

2 に答える 2

1

ベル カーブ分布を探している場合は、複数の乱数を生成してそれらを加算します。より多くの修飾子を探している場合は、それらを最終結果に掛けるだけです。

50% - 150% のボーナスで、ランダムなベル カーブ番号を生成します。Sum(rand(0,15), rand(0,15) , rand(0,15))*(rand(2,6)/2)

ただし、rand が十分な乱数を提供しないことを懸念している場合は、mt_rand を使用できます。これにより、より適切な分布が得られます (メルセンヌ ツイスターを使用)。

于 2012-08-02T19:10:35.780 に答える