実際にはランダムな分布は必要ありません。私がこれを明示的に指摘します。なぜなら、設計のために「ランダム」と考えるのは、通常、真のランダム性ではないからです。
それを念頭に置いて、調整値をいくつか追加してみましょう。これらは、デザインが「適切」と感じられるまでいじり続けるものです。
ChooseLetter() {
const float WordLetterProbability = 0.5f;
if (Random.NextFloat01() < WordLetterProbability) {
// Pick a random letter in the word
}
else {
// Pick a random letter *not* in the word
}
}
確率は、ChooseLetterへの特定の呼び出しがどの程度の確率で単語の文字を与えるかを制御します。0.5の場合、おおよそ1時間おきに単語の文字が得られます。0.25では、4つに1つは単語の文字などになります。
これはまだ少し単純化されています-ランダム性はまあまあランダムなので、単語の文字の間を移動する時間について実際に保証することはできません。(理論的には、単語の文字なしで永遠に行くことができます。それは非常にまれです。)代わりに、単語の文字を取得しないたびに、単語の文字の確率を上げるための係数を追加できます。
const float BaseWordLetterProbability = 0.5f;
const float WordLetterProbabilityIncrease = 0.25f;
float WordLetterProbability = BaseWordLetterProbability;
ChooseLetter() {
if (Random.NextFloat01() < WordLetterProbability) {
// Pick a random letter in the word
WordLetterProbability = BaseWordLetterProbability;
}
else {
// Pick a random letter *not* in the word
WordLetterProbability += WordLetterProbabilityIncrease;
}
}
さて、今私たちは単語の文字なしで2文字以上行くことはありません。(2つのミスの後、単語の文字を取得する確率は1.0になるためです。)
最後に、一言で文字を選択することがどのように機能するかを考慮する必要があります。プレイヤーに実際に必要な文字を提供するには、セットから文字を削除する必要があります。
たとえば、単語が「test」であり、プレーヤーにすでに「s」が含まれている場合、必要がないため、別の「s」を与えたくありません!
ここから、残りはあなたのデザインに合うように調整されます。