编译时与运行时,在Java和C#中
本文关键字:Java 运行时 编译 | 更新日期: 2023-09-27 18:29:29
我在某个地方读到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);
这会生成两个不同的随机数。为什么会出现这种情况?
随机数问题与编译时或运行时无关。它与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。接下来,在你的函数范围内,Random是每次调用的一个新对象。因此,如果您的调用在几毫秒内,您将得到相同的结果。