-1

次のロジックを使用しているサイコロを振るゲームがあります。私は、6 から 12 までのサイコロの値がより少ない確率で落ちることを望んでいます。サイコロの値に基づいて、生徒のボーナス ポイントが増加します。サイコロの値が高いほど、ボーナスポイントが高くなります。したがって、2 から 5 までのサイコロの値は頻繁に落ち、6 から 12 までのサイコロの値は 100 人目の生徒ごとにのみ落ちるはずです。これは Windows アプリケーションであり、サイコロが振られてユーザーがサイコロの値を取得するたびに、アプリケーションが閉じられ、別のユーザーがサイコロを振るために再び開かれます。では、100 番目の生徒が 6 から 12 の間のサイコロの値を取得することを追跡する方法..

for (Int32 i = 0; i < numberOfDice; i++)
{
    Int32 roll = rnd.Next(1, numberOfSides);
    total += roll;

    result.AppendFormat("Congrats..!!! You got Dice {0:00}:\t{1}\n", i + 1, roll);
}

助けてください。これを行う方法についてのアイデア。助けてください。

4

5 に答える 5

0
public int RollDice(int numDice, int numSides)
{
    int total = 0;
    for (int i = 0; i < numDice; i++)
    {
        int roll;
        if(rnd.NextDouble() < 0.01)
            roll = rnd.Next(6, numSides + 1);
        else
            roll = rnd.Next(1, 5 + 1);

        total += roll;

        result.AppendFormat("Congrats..!!! You got Dice {0:00}:\t{1}\n", i + 1, roll);
    }
    return total;
}

このコードは、およそ 100 回に 1 回、6 から maxSides までの値を生成します。とにかく6-12にしたい場合は、これを試すことができます.

public int RollDice(int numDice, int numSides)
{
    int total = 0;
    for (int i = 0; i < numDice; i++)
    {
        int roll;
        if(rnd.NextDouble() < 0.01)
            roll = rnd.Next(6, Math.Min(12, numSides) + 1);
        else
        {
            roll = rnd.Next(1, numSides - (Math.Min(12, numSides) - 6 + 1) + 1);
            if(roll >= 6)
                roll += (Math.Min(12, numSides) - 6 + 1);
        }

        total += roll;

        result.AppendFormat("Congrats..!!! You got Dice {0:00}:\t{1}\n", i + 1, roll);
    }
    return total;
}
于 2013-05-22T07:02:42.073 に答える
0

Randomジェネレーターは均一です。したがって、3 つの RNG を使用します。1 つは大きい値または小さい値を生成するかどうかを決定するためのもので、2 つは小さい値と大きい値をそれぞれ生成するためのものです。

var decider = new Random();
var largeRng = new Random();
var smallRng = new Random();

var deciderValue = decider.Next(1, 100);
int generatedValue;

if (deciderValue == 1) // will happen with probability 1/100
{
    generatedValue = largeRng.Next(6, 12);
}
else
{
    generatedValue = smallRng.Next(1, 5);
}

PS: 同じジェネレーターを使用して生成する値を決定し、それらの値を生成するために再度使用する場合、いくつかの回答のように、生成された小さい値と大きい値は均一に分散されません。

于 2013-05-22T07:26:07.550 に答える