Подтвердить что ты не робот

Случайные числа Java с использованием семян

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

double randomGenerator(long seed) {
    Random generator = new Random(seed);
    double num = generator.nextDouble() * (0.5);

    return num;
}

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

4b9b3361

Ответ 1

Если вы даете одно и то же семя, это нормально, это важная функция, позволяющая проводить тесты.

Проверьте это, чтобы понять псевдо-случайное поколение и семена: http://en.wikipedia.org/wiki/Pseudorandom_number_generator

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

Если вы хотите иметь разные последовательности (обычный случай, когда вы не настраиваете или не отлаживаете алгоритм), вы должны вызвать конструктор нулевого arg, который использует nanoTime, чтобы каждый раз получать другое семя. Конечно, этот экземпляр Random должен храниться вне вашего метода.

Код, вероятно, должен выглядеть следующим образом:

private Random generator = new Random();
double randomGenerator() {
        return generator.nextDouble()*0.5;
}

Ответ 2

Простым способом является использование:

Random rand = new Random(System.currentTimeMillis());

Это лучший способ генерации чисел Random.

Ответ 3

Это принцип Pseudo -RNG. Номера не являются случайными. Они генерируются с использованием детерминированного алгоритма, но в зависимости от семени последовательность сгенерированных чисел изменяется. Поскольку вы всегда используете одно и то же семя, вы всегда получаете одну и ту же последовательность.

Ответ 4

Вам не следует создавать новую область "Случайный метод". Сделайте его членом класса:

public class Foo {
   private Random random 

   public Foo() {
       this(System.currentTimeMillis());
   }

   public Foo(long seed) {
       this.random = new Random(seed);
   }

   public synchronized double getNext() {
        return generator.nextDouble();
   }
}

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

Ответ 5

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

Ответ 6

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

public double[] GenerateNumbers(long seed, int amount) {
    double[] randomList = new double[amount];
    for (int i=0;i<amount;i++) {
        Random generator = new Random(seed);
        randomList[i] = Math.abs((double) (generator.nextLong() % 0.001) * 10000);
        seed--;
    }
    return randomList;
}

Он отобразит тот же список, если вы используете одно и то же семя.

Ответ 7

В нескольких примерах здесь создается новый экземпляр Random, но это необязательно. Также нет оснований использовать synchronized как одно решение. Вместо этого воспользуйтесь методами класса ThreadLocalRandom:

double randomGenerator() {
    return ThreadLocalRandom.current().nextDouble(0.5);
}