我已经读过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);
这会生成两个不同的随机数。为什么会这样?
答案 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是每次调用时的新对象。因此,如果您的呼叫在几毫秒内,您将得到相同的结果。