我有以下代码:
int GetRandNumber()
{
Random r = new Random();
return r.Next() % 6 + 1;
}
我正在开发一个Windows应用商店。我有一个文本框,其中生成一个从1到6的数字。我为每一个号码都做过特定的活动。我需要确保每个数字只生成一次,以便事件不会重复。
答案 0 :(得分:7)
看起来你只需要随机播放数字。我建议创建一个从1到6的数字数组,然后将数组洗牌。您可以看到一些代码here,用于如何对数组/列表进行混洗。
答案 1 :(得分:3)
首先,你需要小心这个实现,如果你多次调用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);
此网站上有关于如何制作随机播放功能的plenty of examples。
答案 2 :(得分:0)
也许我错了,但据我所知,你想要这样的东西作为输出:
344213266125
要实现这一点,您应该跟踪已经生成了哪些数字,并且如果所有数字都已“滚动”至少一次则停止。 所以让我们将bool数组初始化为6个假值,并在每个随机数生成之后(每次滚动之后)将数组的对应元素设置为true。检查数组中是否有任何错误值,如果没有,则“再次滚动”。
另外,您可以考虑根据其他答案生成数字,因为它们当然是正确的:这不是理想的方式。
<强>更新强>
好的,根据您的问题更新我还会更新我的伪代码(或者我应该称之为散文): 跟踪已经“滚动”的数字(如上所述)。生成新数字时,检查是否已生成。如果之前已经滚过,则再次滚动,直到您滚动一个新的:然后相应地更新阵列。另外一定要检查是否有有效的数字或者在滚动开始之前已经滚动了所有数字...
但是现在对我来说,你真正想要的只是一个洗牌,这已经在其他答案中提出。
答案 3 :(得分:0)
也许这对你有用。方法是将随机结果记录在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();
}
}