Внутренние вызовы LibGDX в MathUtils.random () влияют на последовательность генерируемых случайных чисел - PullRequest
0 голосов
/ 24 июня 2018

При использовании генератора случайных чисел (RNG) с заданным начальным числом несколько раз (т. Е. Каждый раз, когда вызывается setSeed() с одним и тем же начальным числом, чтобы начать все сначала), я столкнулся с некоторым отклонением в последовательности чисел, генерируемых на каждом проходе.,Несколько раз ударившись головой о стену, я нашел причину:

box2d s World.createBody() звонит LongMap.put(), что звонит LongMap.push(), а звонит MathUtils.random() внутриwhile loop.

Насколько мне известно, эффекты частиц тоже вызовут MathUtils.random().

Так как я могу доверять последовательности чисел, которая всегда повторяется, если LibGDX внутренне использует один и тот же статический экземпляр RNGи поэтому может испортить последовательность?

Как я должен точно знать, где и когда вызывается MathUtils.random() вне моего кода?

1 Ответ

0 голосов
/ 26 июня 2018

Как отмечает @Peter R, можно создать собственный RNG, который гарантирует, что ничто не помешает последовательности чисел.

Может использоваться любой случайный код Java:

import java.util.Random;

private Random random = new Random();

илиRandomXS128, который используется MathUtils (который расширяет Java Random, но работает быстрее):

import com.badlogic.gdx.math.RandomXS128;

private Random random = new RandomXS128();

Удобные методы-обертки (random () подписи) в MathUtils тоже можно использовать (копировать в собственный класс) согласнонеобходимо, будь то статический или нет.Например:

/** Returns a random number between start (inclusive) and end (inclusive). */
public int random (int start, int end) {
    return start + random.nextInt(end - start + 1);
}

/** Returns a random number between start (inclusive) and end (exclusive). */
public float random (float start, float end) {
    return start + random.nextFloat() * (end - start);
}

Для себя я все еще недоумеваю, почему MathUtils предоставляет общий ГСЧ для внутреннего и внешнего использования, что делает его использование с начальным уровнем небезопасным, и без упоминания об этом вкомментарии.

Но вышеупомянутый обходной путь должен быть удовлетворителен для всех, кто не такой мелкий, как я.

...