卡在数组中

时间:2015-11-06 12:53:15

标签: c# arrays random

所以我有一个包含100个int元素的数组,必须在[-100,100]范围内随机绘制,并且必须返回奇数且在此范围内的数字[-30,30]。我这样做:

int counter = 0;
int i = 0;
int[] numbers = new int[100];
for ( i = 0; i <= numbers.Length; i++)
{
    Random rnd = new Random();
    numbers[i] = rnd.Next(-100, 101);
    if (numbers[i] % 2 != 0)
    {
        if (numbers[i] >= -30 && numbers[i] <= 30)
        {
            counter++;
        }
    }
}
Console.WriteLine(counter);

我建立并没有收到任何错误。但是在运行时我在命令提示符下收到此错误:System.IndexOutOfRangeException:Index超出了数组的范围。然后它引导我走到这一行:

numbers[i]=rnd.Next(-100,101);

那么,就像,发生了什么?我做错了什么?

2 个答案:

答案 0 :(得分:5)

在for-loop中将<=替换为<。所以

for ( i = 0; i < numbers.Length; i++)

而不是

for ( i = 0; i <= numbers.Length; i++)

集合在.NET中为零。所以你发现第一项是0,最后一项是99。

您还应该在循环之外移动Random初始化:

Random rnd = new Random();
for ( i = 0; i < numbers.Length; i++)
{
    // Random rnd = new Random();  <--- No, no!

因为default constructor使用当前时间作为Random的种子。当您使用相同的种子时,您将始终生成相同的序列。由于循环执行得太快,因此使用相同的种子。

引用:

  

默认种子值是从系统时钟派生的,并且是有限的   解析度。结果,创建了不同的Random对象   通过调用默认构造函数来关闭连续   相同的默认种子值,因此,将产生相同的   随机数集。使用单个可以避免此问题   随机对象生成所有随机数

答案 1 :(得分:1)

你的数组从0到100迭代

使用:

for ( i = 0; i < numbers.Length; i++)