私がやろうとしているのは、最小値と最大値が有限であるため、正確にはガウス分布ではありません。この考え方は、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
が、これに適した関数を取得するのにまだ問題があります。ガウス、指数、ロジスティックなど、考えられるほとんどすべての関数を試しましたが、役に立ちませんでした。これまでに機能した唯一の方法は、サイコロを転がすことのこの近似値です。これは、私が必要としているものではないことはほぼ確実です...