编译时与运行时,Java和C#

问题描述:

我已阅读的Java和C++/C#之间的主要区别的地方之一就是Java的做一些事情,在运行时和C#确实在编译时的东西。这是真的?如果是的话,你能解释一下这一点吗?编译时与运行时,Java和C#

在C#,我创建了一个函数,它接受在两个输入,并返回一个随机数(称为RandomNumber(int x, int y)),使用随机的Object。然后我在另一个函数中调用这个函数两次,期望得到两个不同的值(两个不同的随机数)。但是,我始终得到相同的值,这让我感到困惑,因为我可以在Java中做同样的事情,并期望得到不同的数字。

于是我决定,要删除我的功能 - RandomNumber(INT X,int y)对,并调用随机我的其他函数中,出现如下图所示。

Random random = new Random(); 
    int randomNum; 
    int la; 
    randomNum = random.Next(1, 10); 
    numOne.Text = randomNum.ToString(); 
    la = random.Next(1, 10); 

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

+3

http://*.com/a/768001/284240将随机实例传递给方法,因为它调用得太快。 – 2012-03-28 17:36:54

+6

你问过两个完全不同的问题。他们应该在两个单独的职位 - 或者,理想情况下,您将搜索并找到每个部分的各种重复问题的答案。 – 2012-03-28 17:37:10

+4

C++和C#是非常不同的语言,编译时/运行时行为有很大不同。 – 2012-03-28 17:37:35

随机数的问题无关编译时或运行时。它与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.Next然后在您的函数的范围,随机为每次调用一个新的对象。因此,如果你的电话在几毫秒内,你会得到相同的结果。