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

时间:2012-03-28 17:35:42

标签: 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);

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

1 个答案:

答案 0 :(得分:5)

随机数问题与编译时或运行时无关。它与实例化Random类的所有内容有关。

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

以下内容:

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

会生成一系列随机的数字。

此:

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

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

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

然而,在第一个例子中,只有一个Random类,并且在循环的后续迭代中,它知道产生不同的数字,因为它知道它只是在最后一个循环中生成了一个。

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