生成从1到6的随机数,并在最后一个停止

本文关键字:最后一个 随机数 | 更新日期: 2023-09-27 17:54:46

我有以下代码:

int GetRandNumber()
{
    Random r = new Random();
    return r.Next() % 6 + 1;             
}

我正在开发一个windows商店应用程序。我有一个文本框,其中一个单一的数字从1到6生成。对于每一个数字,我都做了一个特定的事件。我需要确保每个数字只生成一次,以便事件不会重复。

生成从1到6的随机数,并在最后一个停止

看起来你只需要洗牌数字。我建议创建一个从1到6的数字数组,然后对数组进行洗牌。您可以在这里看到一些如何洗牌数组/列表的代码。

首先你需要小心这个实现,如果你多次调用GetRandomNumber()非常接近,它会给你相同的结果。一个更好的函数是

int GetRandNumber(Random r)
{
    return r.Next(1, 7); //This does the same as "r.Next() % 6 + 1" but removes bias.
}
//used like
Random rand = new Random();
foreach(var foo in bar)
{
    //The same instance of rand is used for each call instead of a new one each time.
    foo.SomeProp = GetRandNumber(rand);
 }

但是,这与您需要做的事情完全分开,您不应该生成1到6之间的随机数。你需要做的是创建一个从1到6的列表,然后对列表进行洗牌,而不是使用随机数(你可能会在洗牌过程中使用它们,但这是一个实现细节)

List<int> numbers = new List<int>();
for(int i = 1; i <= 6; i++)
{
    numbers.Add(i);
}
MyShuffleListFunction(numbers);

这个网站上有很多关于如何创建shuffle函数的例子

也许我错了,但据我所知,您想要这样的输出:

344213266125

要实现这一点,您应该跟踪哪些数字已经生成,并停止如果所有已经"滚动"至少一次。因此,让我们有一个初始化为6个假值的bool数组,并在每次随机数生成之后(每次滚动之后)将数组对应的元素设置为true。检查数组中是否有假值,如果没有,则"再次滚动"。

同样,你可以考虑根据其他答案生成数字,因为它们当然是正确的:这不是一个理想的方法。

好吧,根据你的问题的更新,我也更新了我的伪代码(或者我应该叫它散文):跟踪已经"滚动"的数字(如上所述)。当生成一个新号码时,检查它是否已经生成。如果它之前被滚动过,那么再滚动一次,直到你滚动到一个新的:然后相应地更新数组。此外,请务必检查是否有一个有效的数字,或者在开始滚动之前所有的数字都已被滚动过。

但现在看来,你真正想要的只是洗牌,这在其他答案中已经提出了

也许这对您有用。方法是将随机结果记录在List中,如果列表中已经存在结果,则跳过输出。

class Program
{
    static int tmp;
    static void Main(string[] args)
    {
        List<int> alreadyFired = new List<int>();                   
        while (alreadyFired.Count != 6)
        {
            Random rng = new Random();
            int diceresult = rng.Next(1,7);
            foreach (var item in alreadyFired)
            {
                if (item == diceresult)
                {
                    tmp = item;
                }
            }
            if (!(tmp == diceresult))
            {
                alreadyFired.Add(diceresult);                 
                Console.WriteLine(diceresult);
            }
        }
        Console.WriteLine("no events left");
        Console.ReadKey();
    }
}