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

Генерация той же последовательности случайных чисел

Я хочу генерировать случайные числа в java, я знаю, что должен использовать существующие методы, такие как Math.random(), однако мой вопрос: как я могу сгенерировать одну и ту же последовательность чисел при каждом запуске приложения? пример: сгенерированная последовательность: 0,9, 0,08,0,6 поэтому я хочу, чтобы эта последовательность генерировалась каждый раз, когда я выполняю этот метод.

4b9b3361

Ответ 1

Конечно, - просто создать экземпляр Random вместо использования Math.random(), и всегда указывать один и тот же семя:

Random random = new Random(10000); // Or whatever seed - maybe configurable
int diceRoll = random.nextInt(6) + 1; // etc

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

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

Ответ 2

Пример повторного использования одного и того же семени.

public static void main(String... args) throws IOException {
    printDoublesForSeed(1);
    printDoublesForSeed(128);
    printDoublesForSeed(1);
    printDoublesForSeed(128);
}

private static void printDoublesForSeed(long seed) {
    double[] doubles = new double[10];
    Random rand = new Random(seed);
    for (int j = 0; j < doubles.length; j++) {
        doubles[j] = (long) (rand.nextDouble() * 100) / 100.0;
    }
    System.out.println("doubles with seed " + seed + " " + Arrays.toString(doubles));
}

печатает

doubles with seed 1 [0.73, 0.41, 0.2, 0.33, 0.96, 0.0, 0.96, 0.93, 0.94, 0.93]
doubles with seed 128 [0.74, 0.53, 0.63, 0.41, 0.21, 0.2, 0.33, 0.74, 0.17, 0.47]
doubles with seed 1 [0.73, 0.41, 0.2, 0.33, 0.96, 0.0, 0.96, 0.93, 0.94, 0.93]
doubles with seed 128 [0.74, 0.53, 0.63, 0.41, 0.21, 0.2, 0.33, 0.74, 0.17, 0.47]

EDIT Интересное злоупотребление случайными семенами.

public static void main(String ... args) {
    System.out.println(randomString(-6225973)+' '+randomString(1598025));
}

public static String randomString(int seed) {
    Random rand = new Random(seed);
    StringBuilder sb = new StringBuilder();
    for(int i=0;i<5;i++)
        sb.append((char) ('a' + rand.nextInt(26)));
    return sb.toString();
}

печатает

hello world

Ответ 3

Вам нужно засеять генератор случайных чисел.

Random random = new Random(aFixedNumber);
random.nextInt();  // will always be the same

Ответ 4

Math.random - это просто оболочка класса java.util.Random. При первом вызове Math.random создается экземпляр класса java.util.Random.

Теперь большинство API не выставляют никаких генераторов случайных чисел, потому что они не могут быть реализованы в программном обеспечении. Вместо этого они используют генераторы псевдослучайных чисел, которые генерируют последовательность случайных чисел, используя кучу формул. Это то, что делает java.util.Random. Тем не менее, каждый генератор псевдослучайных чисел нужно сначала засеять. Если у вас есть два генератора псевдослучайных чисел, которые используют один и тот же алгоритм и используют одно и то же семя, они будут производить одинаковый вывод.

По умолчанию java.util.Random использует миллисекунды с 1 января 1970 года как семя. Поэтому каждый раз, когда вы запускаете свою программу, она будет производить разные номера (если вы не сможете запустить java в течение менее 1 миллисекунды). Итак, решение вашей проблемы - создать свой собственный экземпляр java.util.Random и занести его самостоятельно:

import java.util.Random;

class ... {
    Random randomNumberGenerator = new Random(199711);

    public void ...()
    {
        int randomInt = randomNumberGenerator.nextInt();
        double randomDouble = randomNumberGenerator.nextDouble();
    }
}

randomNumberGenerator всегда будет выплюнуть одну и ту же последовательность чисел, если вы не измените семя (199711).

Ответ 5

Я бы закодировал цифры в приложении. Это занимает больше памяти, но намного быстрее.

Просто распечатайте случайные числа на терминал, затем скопируйте их в свой код.

Обязательно оставляйте комментарий, объясняющий, что вы сделали, или они будут выглядеть черной магией для неинформированного читателя.