所以我有一个包含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);
Run Code Online (Sandbox Code Playgroud)
我建立并没有收到任何错误.但是在运行时我在命令提示符下收到此错误:System.IndexOutOfRangeException:Index超出了数组的范围.然后它引导我到这一行:
numbers[i]=rnd.Next(-100,101);
Run Code Online (Sandbox Code Playgroud)
那么,就像发生了什么一样?我做错了什么?
更换<=用<在for循环.所以
for ( i = 0; i < numbers.Length; i++)
Run Code Online (Sandbox Code Playgroud)
代替
for ( i = 0; i <= numbers.Length; i++)
Run Code Online (Sandbox Code Playgroud)
集合在.NET中为零.所以你发现第一项为0,最后一项为99.
您还应该Random在循环之外移动初始化:
Random rnd = new Random();
for ( i = 0; i < numbers.Length; i++)
{
// Random rnd = new Random(); <--- No, no!
Run Code Online (Sandbox Code Playgroud)
因为默认构造函数使用当前时间作为种子Random.当您使用相同的种子时,您将始终生成相同的序列.由于循环执行得太快,因此使用相同的种子.
引用:
默认种子值源自系统时钟并具有有限的分辨率.因此,通过调用默认构造函数紧密连续创建的不同Random对象将具有相同的默认种子值,因此将生成相同的随机数集.使用单个Random对象生成所有随机数可以避免此问题