Java和C#中的编译时与运行时

use*_*253 0 c# java compiler-construction runtime

我已经读过Java和C++/C#之间的主要区别之一是Java在运行时做了什么,C#在编译时做了些什么.这是真的?如果是这样,你能解释一下吗?

在C#中,我创建了一个函数,该函数接收两个输入并RandomNumber(int x, int y)使用随机对象返回一个随机数(称为).然后我在另一个函数中调用了这个函数两次,期望获得两个不同的值(两个不同的随机数).但是,我不断得到相同的值,这让我感到困惑,因为我可以用Java做同样的事情并期望得到不同的数字.

然后我决定删除我的函数 - RandomNumber(int x,int y)并在我的其他函数中调用Random,如下所示.

    Random random = new Random();
    int randomNum;
    int la;
    randomNum = random.Next(1, 10);
    numOne.Text = randomNum.ToString();
    la = random.Next(1, 10);
Run Code Online (Sandbox Code Playgroud)

这会生成两个不同的随机数.为什么会这样?

Dav*_*vid 5

随机数问题与编译时或运行时无关.它与Random类的实例化地点有关.

Random类并不真正生成真正的随机数.它们是基于包括当前日期/时间和其他几个数据位的数学公式生成的.

下列:

Random r = new Random(100)
for(int i = 0; i < 100; i++)
{
    Console.WriteLine(r.Netc().ToString());
}
Run Code Online (Sandbox Code Playgroud)

将生成一系列看起来随机的数字.

这个:

for(int i = 0; i < 100; i++)
{
    Random r = new Random(100);
    Console.WriteLine(r.Next().ToString());
}
Run Code Online (Sandbox Code Playgroud)

将为几个循环生成相同的数字,然后为几个循环生成一系列相似的数字.

这是因为这个公式.在第二个示例中,每个Random类都使用非常相似的条件创建,因此将产生相同的数字,直到时间变​​化足以改变结果.

但是,对于第一个示例,只有一个Random类,并且在循环的后续迭代中,它知道生成不同的数字,因为它知道它只是在最后一个循环中生成了一个.

如果您的代码正在调用声明新Random对象的函数,然后在函数范围内使用Random.Next,则Random是每次调用时的新对象.因此,如果您的呼叫在几毫秒内,您将得到相同的结果.