一部のゲームの小規模な実行における真のランダム性は望ましくないという以前の回答に同意します-一部のユースケースでは不公平に思えます。
Rubyでの実装のような単純なシャッフルバッグを作成し、いくつかのテストを行いました。実装はこれを行いました:
- それでもフェアであると思われる場合、または最小ロールのしきい値に達していない場合は、通常の確率に基づいてフェアヒットを返します。
- 過去のロールから観測された確率が不公平に見える場合、「公正な」ヒットを返します。
境界確率に基づいて不公平と見なされます。たとえば、20%の確率で、10%を下限、40%を上限として設定できます。
これらの範囲を使用して、10ヒットの実行で、実際の疑似ランダム実装が14.2%の時間でこれらの範囲外の結果を生成したことがわかりました。時間の約11%で、10回の試行で0のクリティカルヒットが記録されました。3.3%の確率で、5回以上のクリティカルヒットが10から発生しました。当然、このアルゴリズムを使用して(最小ロールカウントは5)、「フェアリー」ランのはるかに少ない量(0.03%)が範囲外でした。 。以下の実装が不適切な場合でも(確かにもっと賢いことが可能です)、実際の疑似ランダムソリューションでは不公平であるとユーザーが感じることは注目に値します。
FairishBag
Rubyで書かれた私の肉は次のとおりです。実装全体とクイックモンテカルロシミュレーションは、こちらから入手できます(要旨)。
def fire!
hit = if @rolls >= @min_rolls && observed_probability > @unfair_high
false
elsif @rolls >= @min_rolls && observed_probability < @unfair_low
true
else
rand <= @probability
end
@hits += 1 if hit
@rolls += 1
return hit
end
def observed_probability
@hits.to_f / @rolls
end
更新:この方法を使用すると、クリティカルヒットが発生する可能性が全体的に増加し、上記の範囲を使用すると約22%になります。「実際の」確率を少し低く設定することで、これを相殺できます。フェアリッシュな修正を加えた17.5%の確率は、約20%の観測された長期確率をもたらし、短期の実行を公平に保ちます。