为什么这个随机Next()会抛出异常?

时间:2013-10-14 10:35:07

标签: c# exception for-loop random

嗨,我是编程新手,正在阅读本书。这是其中一章的结尾处的练习。但我的代码抛出了这个异常。

        Random rand = new Random();
        List<int> numbers = new List<int>();

        for (int i = 0; i < 1000; i++)
        {
            numbers[i] = rand.Next(1, 1001);
        }

        for (int i = 0; i < numbers.Count; i++)
        {
            listBox1.Items.Add(numbers[i]);
        }

这是错误: enter image description here

5 个答案:

答案 0 :(得分:5)

numbers为空,因此任何索引都无效。使用numbers.Add添加数字,或者更好地使用预先设置的数组。此处不需要使用List。数组很好,因为最终的大小是已知的。它也更快,虽然这似乎不是一个问题。

答案 1 :(得分:3)

ArgumentOutOfRangeException仅在Random.Next minValue is greater than maxValue.时根据http://msdn.microsoft.com/en-us/library/2dx6wyd4.aspx#ddueExceptionsToggle

进行调用

您的问题与numbers[i]一致,因为数字元素为零,这意味着设置numbers[0] = random.Next(1, 1000);将返回ArgumentOutOfRangeException,因为还没有范围。请改用numbers.Add(random.Next(1, 1000));

只是一个提示,当在数组类型对象中使用索引器时(当你使用object[key]时)和for循环时,你应该总是使用数组长度作为for循环的上限,如下所示:

for(int i = 0; i < 1000 && i < numbers.Count(); i++){
    //Do stuff with i
}

在你的情况下,循环永远不会发生,因为i总是小于numbers.Count(),除非你向它添加项目

答案 2 :(得分:1)

您的号码列表还没有任何元素。

试试这个:

numbers.add(rand.Next(1, 1001));

答案 3 :(得分:1)

尝试

numbers.Add(rand.Next(1, 1001));

而不是

numbers[i] = rand.Next(1, 1001);

因此您可以拥有动态调整大小的列表。

您的列表在索引位置i没有任何内容,因此您会收到ArgumentOutOfRangeException。如果给定索引处存在某些内容,则只能通过索引访问集合中的项目。

答案 4 :(得分:1)

Try with this 

List

   Random rand = new Random();
                List<int> numbers = new List<int>();
                //int [] nums ;
                for (int i = 0; i < 1000; i++)
                {
                    //nums[i] = rand.Next(0, 1000);
                    numbers.Add(rand.Next(0,1000));
                    //numbers[i] = rand.Next(1, 1001);
                }

------------------------或---------------------- --------------------

您也可以使用数组

Array

Random rand = new Random();
            List<int> numbers = new List<int>();
            int [] nums = new int [1000] ;
            for (int i = 0; i < 1000; i++)
            {
                nums[i] = rand.Next(0, 1000);                

            }