-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

2

抽奖呢?您可以预先生成一个可能值的数组,其中数字在数组中的次数为 1/概率。那么您可以简单地使用从 0 到数组长度的任何类型的随机数。

var sweeps = new List<int>();

for (int i = 1; i < 6; i++)
{
    for (int j = 0; j < 100; j++)
    {
        sweeps.Add(i);
    }
}

for (int i = 6; i <= 12; i++)
{
    sweeps.Add(i);
}

var count = sweeps.Count;

for (int i = 0; i < numberOfDice; i++)
{
    int roll = sweeps[rnd.Next(1, count)];
    total += roll;

    result.AppendFormat("Congrats..!!! You got Dice {0:00}:\t{1}\n", i + 1, roll);
}
于 2013-05-22T07:06:53.250 回答
0
public int RollLoadedDie(int numberOfSides)
{
    const lesserProbability = 50;
    int ret;
    bool keepValue;
    do
    {
        ret = rnd.Next(1, numberOfSides);
        if(ret == 6 || ret == 12)
            keepValue = rnd.Next(1, 100) > lesserProbability;
        else
            keepValue = true;
    }
    while(keepValue == false);
    return ret;
}
于 2013-05-22T06:55:29.520 回答
0

Random生成器是统一的。因此,使用三个RNG:一个决定它应该生成大值还是小值,两个分别生成小值和大值。

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 回答
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;
}

此代码将大致每一百次生成一个从 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
public int roleDice(int numberOfSides)
{ 
 // the chance in which the dice throws a value from 6   to 12

 int Large = rnd.Next(1,100) ; 
 for(int i =1 ; i < 101 ; i++)
 {
 if(i ==Large) // Only once for 100 times we throw a value between 7 , 12 included.
 keepValue = rnd.Next(7,12);

 else // For rest throw a value between 1 and 6
keepValue = rnd.Next(1,6);
}
return keepValue
}
于 2013-05-22T07:05:38.470 回答