Время компиляции и время выполнения, в Java и C # - PullRequest
0 голосов
/ 28 марта 2012

Я прочитал где-то одно из основных отличий между 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);

Это генерирует два разных случайных числа.Почему это так?

1 Ответ

5 голосов
/ 28 марта 2012

Случайное число не имеет ничего общего со временем компиляции или во время выполнения. Это связано с тем, где создается экземпляр класса 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 является новым объектом при каждом вызове. Поэтому, если ваши звонки в течение нескольких миллисекунд, вы получите тот же результат.

...