質問に2つの全く異なることがあります。あなたは、与えられたアルゴリズムが両方を行うことができないので、あなたが望むものを決める必要があります。
試してみるたびに、10%の可能性があります。 2回連続してヒットした場合、200回試してもヒットしないことがあります。しかし、長期的には、それは時間の10%を打つ。
10回の試行のうち1回だけ試してみると、それは正確に1回、それ以上決して少なくないことを保証します。
上記の最初のものは、適切な乱数のピックと比較でうまくいきます。しかし、あなたは予想以上にヒット数が多く、予想よりもヒット数が少なくなります。時間が経つと平均ヒット数は10%になります。
function getRandomTenPercentOutcome() {
return Math.random() < 0.1;
}
第2のものは、ランダムジェネレータと最近のイベントの追跡を組み合わせた複雑な実装が必要です。保証された10分の1ヒットを実現する最も簡単な方法は、サーバーに0が埋め込まれたセルを作成させ、次に1つのセルをランダムに選択して1に変更することです。
次に、ランダム結果、あなたは.shift()
配列の最初の項目をオフにして、その値を使用します。配列が空になると、新しいものを作成します。これにより、正確に1/10の結果(最初から開始)が強制的に適用されます。指定された10の結果は、新しい配列の作成の境界を越えても2または0になる可能性がありますが、これ以上のことはできません。
アレイをシステム全体(すべてのユーザーに対して1つのアレイ)またはユーザーごとに(各ユーザーには独自の結果アレイがあります)作成できます。各ユーザーが個人的に1/10に非常に近いと知りたい場合は、ユーザーごとに個別の結果配列を作成する必要があります。
アレイの長さを調整して、どれだけの分散を許容するかを制御することができます。たとえば、配列50を長く作成し、配列内の5つのセルをランダムに選択することができます。それはしかし、まだ両方の方法は、長期的に10%を平均化する50
内5本のヒットを強制する、50内のより多くの可変性を可能にするであろう。 1つ目は任意の間隔で10%より大きな偏差があるかもしれませんが、はるかにランダムです。 2つ目は10%からずっと小さな偏差がありますが、ランダムではないと言う人もいます(必ずしも悪いわけではありません - あなたの目的によります)。どちらも「公正」です。
私は息子のゲームから、そのストリークが一連のランダムな出来事からの時折予想される結果内にあるにもかかわらず、起こりそうもない出来事が起こったときに「不公平」と感じることを知っています。だから、本当に無作為の時折散発的な性質のために、時には本当にランダムなものが参加者にとって公平でないように見えるかもしれません。
本当に配列の方法が好き、良い考えがそこにあった。 –