Откуда эта случайность? - PullRequest
0 голосов
/ 24 мая 2010

Я работаю над исследовательским проектом по извлечению данных и использую код из большого svn.

Видимо, один из методов, которые я использую из этого svn, использует где-то случайность, не запрашивая начальное число, которое делает 2 вызовав моей программе вернуть разные результаты.Это раздражает из-за того, что я хочу сделать, поэтому я пытаюсь найти эту «неконтролируемую» случайность.

Поскольку используемые мной классы зависят от многих других, делать это вручную довольно больно.Любая идея, как я мог найти, откуда взялась эта случайность?

Редактировать:

Грубо говоря, мой код структурирован так:

- stuff i wrote
- call to a method I didnt write involving lots of others classes
- stuff i wrote

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

Идея:

То, что я ищу, может быть инструментом или плагином Eclipse, который быПозвольте мне видеть каждый раз, когда создается экземпляр Random во время выполнения моей программы.Знаете что-нибудь подобное?

Ответы [ 6 ]

2 голосов
/ 24 мая 2010

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

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

Random r = new Random(seedValue);

Таким образом, даже с ответом от StackOverflow у вас все еще есть детективная работа, чтобы найти нужный код.

1 голос
/ 24 мая 2010

Может быть, вы хотите прочитать это:

В Java, когда вы создаете новый объект Random, начальное значение автоматически устанавливается на системные часы «текущее время» в наносекундах. Итак, когда вы проверяете источник класса Random, вы увидите конструктор, примерно такой:

public Random()
{
    this(System.nanoTime());
}

Или, может быть, это:

В Eclipse вы можете установить курсор в переменную и затем нажать F3 или F2 (я точно не знаю). Это приведет вас к тому, что эта переменная объявлена.

Второй инструмент, который вы можете использовать, - «Найти использование». Затем ваша IDE будет искать все способы использования метода, переменную или переменную или все, что вы хотите.

1 голос
/ 24 мая 2010

Может быть, это немного старомодный стиль, но ...

Как насчет трассировки промежуточных результатов (переменных, аргументов функций) в стандартный вывод, сбора входных данных для двух разных прогонов и проверки, где они начинают различаться?

0 голосов
/ 25 мая 2010

Реализации класса Java "Set" не гарантируют, что они повторяют элементы в одном и том же порядке. Таким образом, даже если вы дважды запускаете программу на одном и том же компьютере, порядок, в котором выполняется просмотр набора, может измениться. Ничего не могу с этим поделать, если не поменять все «установленные» использования на «списки».

0 голосов
/ 24 мая 2010

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

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

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

0 голосов
/ 24 мая 2010

Какой "большой svn" вы используете?

Вы можете написать несколько простых тестов, чтобы проверить, возвращают ли два одинаковых вызова базовых функций два одинаковых результата ...

вы знаете, где создан объект Random, вам придется выполнять какую-то детективную работу таким образом.

Какая часть этого кода открыта для вас?

...