2013-08-09 2 views
0

Недавно я прочитал, что вы не хотите создавать новые экземпляры, когда это не нужно. Я не уверен, понимаю ли я его слова. Проблема была повторение этого в LogCat:Эффективность случайного метода

08-09 17:12:11.300: D/dalvikvm(19620): GC_FOR_ALLOC freed 2281K, 23% free 9365K/12048K, paused 12ms, total 12ms 

Так что лучше иметь этот метод:

public int rand(int i) { 
    int rand = new Random().nextInt(i); 
    return rand; 
} 

чем иметь этот метод:

public int rand(int i) { 
    return new Random().nextInt(i); 
} 

, если вы звоните Ранд() много? Почему или почему нет? Спасибо, что помогли newb!

+2

Не думаю, что вы поняли, что прочитали. Оба примера, которые вы показываете, - это то же самое и создайте новый экземпляр «Random» –

ответ

4

ли это:

class ... { 

    private final Random dice = new Random(); 

    public int rand(int i) { 
    return dice.nextInt(i); 
    } 

} 

Таким образом, вы вызываете new Random() только один раз, вместо того, чтобы каждый раз, когда вы создаете ряд.

+0

именно то, что я искал. спасибо erickson! – Evorlor

+0

будет ли он работать так же хорошо, если я не включу final? – Evorlor

+1

Он будет работать без него, но переменные экземпляра должны быть 'final', если вы не нуждаетесь *, чтобы изменить их значение. Это просто хорошая практика. – erickson

4

Я бы пообещал, что эти два метода будут генерировать одинаковый байт-код. То, что вы на самом деле хотите достичь, состоит в том, чтобы иметь один экземпляр Random и просто вызвать nextInts из этого экземпляра, чтобы не переустанавливать семя все время.

+0

ty. Я не совсем понимаю, что ты думаешь. вы можете попросить объяснить это по-другому, пожалуйста? если бы у меня был только один случай случайности, не повторялось бы это одно и то же число? – Evorlor

+1

http://stackoverflow.com/questions/3816952/java-advantage-of-using-static-variable-in-java Эти вопросы имеют некоторую актуальность. Обратите внимание, что оба метода, которые вы опубликовали, скорее всего, на 100% идентичны при компиляции. – Zavior

+0

Объект 'Random' поддерживает внутреннее состояние, так что каждый раз он будет возвращать другое число. – yshavit

-2

Мне кажется, что вы делаете вещи более сложными, чем они должны быть. Вместо вызова метода, который создает объект Random и возвращает новое случайное число, просто создайте объект Random в методе, который вызвал ваш метод rand (int i). Например, вместо того, чтобы сделать это:

public void someMethod() 
{ 
    int randomInt = rand(5); 
} 

ли это:

public void someMethodImproved() 
{ 
    Random randObject = new Random(); 
    int randInt = randObject.nextInt(5); 
} 

Вы можете продолжать называть randObject.nextInt (5) до тех пор, как вы хотите, и он будет продолжать давать вы псевдослучайные целые числа от 0 (включительно) и 5 ​​(исключая).

1

Эксплуатационные характеристики здесь являются лишь случайными. Если при каждом вызове вы создаете новый объект Random, вы не только тратите время, но и получаете случайные числа. Вы ДОЛЖНЫ создать объект Random только один раз, чтобы создать генератор, после чего вызовы различных функций next... будут производить случайные числа из этого генератора. Вот как работают генераторы случайных чисел.

Смежные вопросы