我在某处读到过 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.Next,那么在您的函数范围内,Random 是每次调用时的一个新对象。 因此,如果您的调用在几毫秒内,您将得到相同的结果。