C# 我试图为我的列表框找到随机的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

我希望我的列表框有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.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();