2016-09-11 4 views
1

Предположим, у вас есть Java-код, в котором вы используете объект Random, инициализированный постоянным семенем. В вашем коде вы используете объект Random для генерации различных псевдослучайных целых чисел. Вы не используете многопоточность. Возможно ли иметь разные результаты в разных исполнениях кода? Например, в случае, если компилятор Java удаляет любые избыточные вызовы объекта Random случайным образом, чтобы оптимизировать код, выполнение будет различным каждый раз, если вы перекомпилируете код.Может ли Java Случайный объект давать разные результаты в разных исполнениях для одного и того же семпла?

+1

Имеет ли программа какие-либо входы, которые изменили бы его порядок выполнения? – pjs

ответ

2

Теоретически другой JVM может использовать различную реализацию для псевдослучайного алгоритма. Различные версии JVM также могут это сделать, поскольку он нигде не указывается, что ему нужно возвращать одинаковые значения для заданного семени между различными версиями. Однако, насколько я знаю, реализация Random в Oracle JDK была такой же с момента ее создания.

Учитывая ту же среду исполнения, выход гарантирован.

2

Нет, это в значительной степени guaranteed, предполагая одно и то же environement между двумя пробегами.

PRNG может быть запущен из произвольного начального состояния, используя начальное состояние. Он всегда будет производить ту же последовательность при инициализации с этим состоянием

И слава богу, оптимизатор не будет никогда изменить что-либо с прямыми последствиями побочных эффектов.

Если он удаляет мертвый код, это потому, что код считается мертвым при каждом возможном состоянии программы, поэтому не может повлиять на последовательность вызовов на Random.

1

Я думаю, что это должно быть последовательным, если вы используете одну и ту же JVM в той же системе. Я просто попробовал следующее.

import java.util.Random; 

public class test 
{ 
    public static void main(String[] args) 
    { 
     Random r = new Random(123); 
     System.out.println(r.nextInt()); 
    } 
} 

Он выдавал тот же результат каждый раз, когда я запускаю его на своей машине. Я использую Open JDK 1.8.0_91 на Ubuntu 16.04. Значение, которое я получаю при запуске этого кода, равно -1188957731. Почему бы вам не попытаться запустить его и посмотреть, получаете ли вы такое же значение.

1

Если вы не вводите какой-либо другой источник энтропии (например, использование ввода или каким-либо образом окружающая среда может повлиять на программу), одно и то же случайное семя будет производить одинаковый результат при каждом выполнении.

Обратите внимание, что это связано с выполнением одного и того же байтового кода. Теоретически, изменение вашего компилятора для компиляции одного и того же исходного кода может привести к созданию другого байтового кода, который приведет к другому результату, но было бы довольно сложно найти реальный пример, чтобы продемонстрировать это.