C# 我试图为我的列表框找到随机的6个相互不相等的数字
我希望我的列表框有6个非等随机数C# 我试图为我的列表框找到随机的6个相互不相等的数字,c#,arrays,C#,Arrays,我希望我的列表框有6个非等随机数 private void Button1_Click(object sender, EventArgs e) { listBox1.Items.Clear(); int[] numbers = new int[5]; Random rnd = new Random(); for (int i = 0; i < numbers.Length; i++) { numbers[i] = rnd.Nex
private void Button1_Click(object sender, EventArgs e)
{
listBox1.Items.Clear();
int[] numbers = new int[5];
Random rnd = new Random();
for (int i = 0; i < numbers.Length; i++)
{
numbers[i] = rnd.Next(1, 50);
if (Array.IndexOf(numbers, i) == -1)
{
listBox1.Items.Add(numbers[i]);
}
}
}
private void按钮1\u单击(对象发送者,事件参数e)
{
listBox1.Items.Clear();
int[]数字=新的int[5];
随机rnd=新随机();
for(int i=0;i
我想不出我在这段代码上犯了什么错误。问题在于for循环继续增加其索引器,即使您没有找到唯一的数字,并且在不检查数字是否已存在的情况下立即填充数组。通过这种方式,您的列表中的项(唯一项)有时比数字数组中的项(重复项)少 在这种情况下,最好的方法是使用while循环,而不是for循环,该循环带有一个显式索引器,当您找到一个唯一的数字时,该索引器将递增,直到它到达数组中的最后一个位置
int[] numbers = new int[6];
Random rnd = new Random();
// First position in the array to fill
int index = 0;
while(index < number.Length)
{
int number = rnd.Next(0, 50);
if (!numbers.Contains(number))
{
// OK we don't have it add to the array and to the list
numbers[index] = number;
listBox1.Items.Add(numbers[index]);
// Point to the next position to fill
index++;
}
}
但是,您需要一个循环来将数字数组添加到列表中,正如下面的注释所指出的,这可能不是很有效请注意,即使您有一个重复的值,您也只能创建6个值。
listBox1.DataSource=numbers代码>或直接:listBox1.DataSource=Enumerable.Range(1,50).OrderBy(x=>rnd.Next(1,50)).Take(6.ToList()
@Jimi:虽然这样做可以,但我不清楚为什么您要使用rnd.Next(1,50)
作为您的订单键,而不仅仅是rnd.NextDouble()
。数字1到50有什么特别的地方吗?此外,如果范围远远大于50,此解决方案将变得越来越低效。@Eric Lippert不是我的解决方案。我只是整理了史蒂夫的建议(我没有改变方法)(1,50)
是问题(也在Steve的回答中)中看到的值的范围。在rnd.Next(1,50)
中不需要,但是Steve已经修复了这个问题。它意味着填充列表框(最慢的部分)。如果ListBox已经包含了一些对象,那么也可能不需要这样做。OP可能会发现这一点很有用。OrderBy
是稳定的,因此索引较低的较小数字和索引较高的较大数字的变化会增加,并且总体较小的数字会包含较高的变化。
var indexes = Enumerable.Range(1, 50).ToList();
Random rnd = new Random();
int[] numbers = indexes.OrderBy(x => rnd.Next()).Take(6).ToArray();