循环永远不会达到最终值
本文关键字:永远 循环 | 更新日期: 2023-09-27 17:59:28
这是我试图为我的卡片软件创建的随机唯一数字生成器。它生成数字并写入数组。我对这里的循环有问题。当整数i达到29时,它停止增长,代码无限循环,永远不会达到30,这将停止循环。
如果没有if语句,它可以工作,但无法满足所需的范围。
修复了代码,现在工作正常,数组中的初始值是问题所在。现在我需要0-29个值
public partial class Form1 : Form
{
int[] rndCards = new int[30];
public Form1()
{
InitializeComponent();
richTextBox1.Text = @"random numbers";
}
private void button1_Click(object sender, EventArgs e)
{
int i = 0;
rndCards = new int[30];
richTextBox1.Clear();
Random rnd = new Random();
while (i < 30)
{
int cardTest = rnd.Next(0, 30);
while (rndCards.Contains(cardTest))
{
cardTest++;
if (cardTest == 31)
{
cardTest = 1;
}
}
rndCards[i] = cardTest;
i++;
}
i = 0;
while (i < 30)
{
rndCards[i] = rndCards[i] -1;
richTextBox1.Text += rndCards[i] + ", ";
i++;
}
}
}
问题在于创建数组时数组已经包含数字0这一简单事实(因为数组的每个项都初始化为其成员类型的默认值)这就是为什么您应该从1而不是零开始i。
int i = 1;
另一种更简单的方法:
您可以将此作为一个简单的随机数生成:
Random rnd = new Random();
rndCards = Enumerable.Range(0, 30).OrderBy(x => rnd.Next()).ToArray();
foreach(var card in rndCards)
{
// do something
}
rnd.Next(0,30)
将返回一个0-29之间的随机数。
来自Random.Next(Int32, Int32)
:的文档
下一个(Int32,Int32)重载返回范围从minValue到maxValue–1的随机整数。但是,如果maxValue等于minValue,则该方法将返回minValue。
使用int cardText = rnd.Next(0, 31);
,这应该可以解决您的问题。
上界是互斥的(C#随机。下一步-从不返回上界?)。
int cardTest = rnd.Next(0, 31);