这是我尝试为我的卡片软件创建的随机唯一数字生成器。它生成数字并写入数组OK。我在这里遇到循环问题。当整数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 :(得分:2)
问题在于一个简单的事实,即数组在创建时已包含数字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
}
答案 1 :(得分:1)
rnd.Next(0,30)
将返回0-29之间的随机数。
来自Random.Next(Int32, Int32)
的文档:
Next(Int32,Int32)重载返回从minValue到maxValue的随机整数 - 1.但是,如果maxValue等于minValue,则该方法返回minValue。
使用int cardText = rnd.Next(0, 31);
,这可以解决您的问题。
答案 2 :(得分:0)
上限是独占的(C# Random.Next - never returns the upper bound?)。
int cardTest = rnd.Next(0, 31);