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

问题描述 投票:0回答:1

我在某处读到过 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);

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

java c# runtime
1个回答
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 是每次调用时的一个新对象。 因此,如果您的调用在几毫秒内,您将得到相同的结果。

© www.soinside.com 2019 - 2024. All rights reserved.