我在Random
循环中创建了一个名为x
的{{1}}类对象,并调用for
,该对象应返回x.next(1,7)
和{{1}之间的变量},对象创建和1
函数都放在for循环中,执行6
次而不是返回随机变量,它在每次迭代中返回相同的值
x.next()
我的输出如下
5
当我将对象声明放在循环之外时,它会在每次迭代中返回随机变量
using System;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
for(int i=1;i<=5;i++)
{
Random x = new Random();
Console.WriteLine( x.Next(1,7));
}
}
}
}
这次我的输出是
5
5
5
5
5
并且当 using System;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Random x = new Random();
for(int i=1;i<=5;i++)
{
Console.WriteLine( x.Next(1,7));
}
}
}
}
被声明为类Program的静态变量时也可以工作,如下所示
4
5
9
3
1
现在输出
x
但我想知道为什么在循环内声明对象时返回相同的值 当对象变量声明为静态时会发生什么?
答案 0 :(得分:4)
这是因为Random
的默认构造函数使用种子的当前系统时钟时间。
因为系统时钟时间每秒只更新几次,如果你在紧密循环中构造了很多Random
个对象,它们将被创建得如此之快以至于系统时钟时间没有改变,导致他们使用相同的种子。
如果使用相同的种子构造两个Random
个对象,它们将生成相同的随机数序列。这就是你所看到的。