当C#中的对象变量声明为静态时会发生什么
我在当C#中的对象变量声明为静态时会发生什么,c#,object,random,static,C#,Object,Random,Static,我在for循环中创建了一个名为x的Random类对象,并调用了x.next(1,7),它应该返回一个介于1和6之间的变量,对象创建和x.next()函数被放置在for循环中,该循环执行5次而不是返回随机变量,它在每次迭代中返回相同的值 using System; namespace ConsoleApplication1 { class Program { static void Main(string[] args) {
for
循环中创建了一个名为x
的Random
类对象,并调用了x.next(1,7)
,它应该返回一个介于1
和6
之间的变量,对象创建和x.next()
函数被放置在for循环中,该循环执行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));
}
}
}
}
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));
}
}
}
}
当我将对象声明放在循环之外时,它会在每次迭代中返回随机变量
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));
}
}
}
}
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));
}
}
}
}
当x
被声明为类程序的静态变量时,它也起作用,如下所示
using System;
namespace ConsoleApplication1
{
class Program
{
static Random x = new Random();
static void Main(string[] args)
{
for(int i=1;i<=5;i++)
{
Console.WriteLine( x.Next(1,7));
}
}
}
}
但我想知道为什么在循环中声明对象时它返回相同的值
当对象变量声明为静态时会发生什么呢?这是因为Random
的默认构造函数使用种子的当前系统时钟时间
由于系统时钟时间每秒只更新几次,因此如果在紧循环中构造大量的随机对象,它们的创建速度将非常快,以至于系统时钟时间在这两个对象之间没有变化,从而导致它们使用相同的种子
如果两个Random
对象使用相同的种子构造,它们将生成相同的随机数序列。这就是您所看到的。之所以发生这种情况,是因为Random
的默认构造函数使用当前系统时钟时间作为种子
由于系统时钟时间每秒只更新几次,因此如果在紧循环中构造大量的随机对象,它们的创建速度将非常快,以至于系统时钟时间在这两个对象之间没有变化,从而导致它们使用相同的种子
如果两个Random
对象使用相同的种子构造,它们将生成相同的随机数序列。这就是您所看到的。我想知道当对象变量(这里x)被声明为类(这里是程序)的静态变量时会发生什么。我想知道当对象变量(这里x)被声明为类(这里是程序)的静态变量时会发生什么。答案很好,我不知道。尝试了示例代码,但循环次数为100000,您确实开始看到一些不同的数字最终出现,但它们仍然是相同数字的长序列,仍然与上面的解释相匹配。@Gurukulum:由于您在代码中使用的随机类在系统时钟时间上工作,因此输出有所不同。回答很好,一些我不知道的事情。尝试了示例代码,但循环次数为100000,您确实开始看到一些不同的数字最终出现,但它们仍然是相同数字的长序列,仍然与上面的解释相匹配。@Gurukulum:由于您在代码中使用的随机类在系统时钟时间上工作,因此输出有所不同。
4
7
3
7
9