Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Помогите разобраться с Random числами


Автор: bulat01 20.12.2010, 08:21
Здравствуйте спецы по Java,
помогите разобраться с кодом, точнее с применением Random

Код

import java.util.*;

public class ArrayNew {
    public static void main(String[] args) {
        int[] a;
        Random rand = new Random(47);
 
        a = new int[rand.nextInt(20)];       
        System.out.print("length of a = " + a.length);
        System.out.print(Arrays.toString(a));
        }
}


При ранинге - он кидает следующий вывод:
length of a = 18[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]


Random (long seed) - Creates a new random number generator using a single long seed.
nextInt (int n) - Returns a pseudorandom, uniformly distributed int value between 0 (inclusive) and the specified value (exclusive), drawn from this random number generator's sequence.

Первый вопрос:
nextInt - для меня понятно его логика работы, он генерирует случайное число от 0 до 19 (исключая 20), это в моем случае.
Но почему 18, а не 19?

Второй вопрос:
Единственное что понял в логике работы Random (long seed) - что если задать начальное число, при постоянном ранинге программы - случайное число выдааное генератором неизменно.
Вы не могли бы более детально описать функцию Random (long seed)?
а также если его рассматривать с комбинацией с nextInt?






Автор: jk1 20.12.2010, 12:18
Цитата

If two instances of Random are created with the same seed, and the same sequence of method calls is made for each, they will generate and return identical sequences of numbers.


В JavaDoc в принципе все написано: Если Вы задаете одинаковый seed для двух независимых Random объектов, то генерируемые ими последовательности совпадут.

Автор: LSD 20.12.2010, 12:28
Цитата(bulat01 @  20.12.2010,  09:21 Найти цитируемый пост)
Вы не могли бы более детально описать функцию Random (long seed)?

1. Random это http://ru.wikipedia.org/wiki/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%82%D0%BE%D1%80_%D0%BF%D1%81%D0%B5%D0%B2%D0%B4%D0%BE%D1%81%D0%BB%D1%83%D1%87%D0%B0%D0%B9%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB.
2. seed это начальное значение для этого генератора. Как следствие seed полностью определяет последовательность генерируемых чисел.



Цитата(bulat01 @  20.12.2010,  09:21 Найти цитируемый пост)
Но почему 18, а не 19?

А что 18 недостаточно случайное число? smile 

Автор: nc30 20.12.2010, 16:54
Цитата(bulat01 @ 20.12.2010,  08:21)
Единственное что понял в логике работы Random (long seed) - что если задать начальное число, при постоянном ранинге программы - случайное число выдааное генератором неизменно.

Удобно использовать следующий вызов
Код

Random rand = new Random(new Date().getTime());

Учитывая, что
Цитата

long  getTime()
          Returns the number of milliseconds since January 1, 1970, 00:00:00 GMT represented by this Date object.

можно особо не беспокоиться о повторяемости "семени" (seed) генератора "при постоянном ранинге программы" smile

Автор: LSD 20.12.2010, 17:24
Цитата(nc30 @  20.12.2010,  17:54 Найти цитируемый пост)
Удобно использовать следующий вызов

У дефолтного конструктора Random в версии 1.4 именно такое поведение. В версиях 1.5 и старше, они используют более продвинутую методику. Думаю не имеет смысла пытаться ее улучшить, умолчальный алгоритм и так достаточно хорош.

Автор: nc30 20.12.2010, 20:45
LSD, спасибо за информацию. Хотел, кстати, отослать bulat01 к http://download.oracle.com/javase/6/docs/api/index.html?java/util/Random.html, но самому надо читать их внимательнее smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)