生成从1到6的随机数,并在最后一个停止
本文关键字:最后一个 随机数 | 更新日期: 2023-09-27 17:54:46
我有以下代码:
int GetRandNumber()
{
Random r = new Random();
return r.Next() % 6 + 1;
}
我正在开发一个windows商店应用程序。我有一个文本框,其中一个单一的数字从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();
}
}