我想检查数组中是否有相同的值,如标题中所述。如果有的话,我想传递该值并检查另一个随机值以添加到列表框。
在我的表单中,有2个文本框,1个列表框和1个按钮。单击按钮时,列表框必须显示最多为textbox1和textbox2之和的随机数。例如;
从文本框1输入5,从文本框2输入10。总和当然是15,列表框必须显示15个随机数,但是这些数字必须彼此不同。
我写了类似的东西,并使用Contains方法检查是否有相同的值。但是程序冻结了,没有给出任何错误。
int a, b;
Random rnd = new Random();
int[] array;
private void button1_Click(object sender, EventArgs e)
{
a = Convert.ToInt32(textBox1.Text);
b = Convert.ToInt32(textBox2.Text);
int c = a + b;
array = new int[c];
for (int i = 0; i < array.Length; i++)
{
int number = rnd.Next(c);
foreach(int numbers in array)
{
if (array.Contains(numbers))
{
i--;
}
else
{
array[i] = number;
listBox1.Items.Add(array[i]);
}
}
}
我也这样做了,没有foreach(只包含我要说的部分)。也没有用。我写的是“ else”;
array[i] += number;
它也不起作用。
如果您能帮助我,我将不胜感激。预先感谢。
答案 0 :(得分:3)
使用while循环代替for循环:
int = 0;
while(i<c)
{
int random rnd.Next(c);
if(!array.Contains(random))
array[i++] = random;
}
您还可以创建一个1-15的数字列表,然后对其进行随机播放(因为您的随机函数将仅创建1-15的随机数字,只是随机的):
array = Enumberable.Range(0,c).OrderBy(x => rnd.Next()).ToArray();
上面的代码要快得多,因为假设我们已经生成了14个随机数,只剩下一个数字(例如5个),它必须经过几次循环,以便最终生成的随机数等于5,但是在上面的代码中,无需检查,我们只有所有数字,然后将其洗牌。
答案 1 :(得分:2)
您可以尝试使用do...while
代替for loop
Random.Next
从0
到c - 1
取值,因此rnd.Next(c + 1);
需要加上1
,否则循环不会停止。
var array = new int[c];
int number;
for (int i = 0; i < array.Length; i++)
{
do
{
number = rnd.Next(c + 1);
} while (array.Contains(number));
array[i] = number;
listBox1.Items.Add(array[i]);
}
答案 2 :(得分:1)
基本上,您需要重新整理数据。创建具有所有值的集合:
var temp = Enumerable.Range(0, c);
现在随机订购
temp = temp.OrderBy(_ => rnd.Next());
现在您可以将temp
添加到listBox
或者,作为单行:
listBox1.Items.AddRange(Enumerable.Range(0, c).OrderBy(_ => rnd.Next()));