Дешевый и веселый рэнд () замена

После профилирования большой программы ведения игры я нашел, что рэнд библиотечной функции () использует значительную часть общего времени обработки. Мои требования для генератора случайных чисел не очень обременительны - не важный, что он передает большую батарею статистических тестов чистой случайности. Я просто хочу что-то дешевое и веселое, которое очень быстро. Какие-либо предложения?

9
задан Kramii Reinstate Monica 16 June 2010 в 10:32
поделиться

7 ответов

Есть несколько широко используемых алгоритмов, которые быстрее, чем LCG (что очень, очень вероятно, что и использует rand () ). Вы можете попробовать генератор Marsaglia Xorshift , который работает довольно быстро (в зависимости от оборудования). Генератор WELL512a также довольно быстр (больше, чем MT19937 или MT19937-64).

7
ответ дан 4 December 2019 в 12:59
поделиться
4
ответ дан 4 December 2019 в 12:59
поделиться

Вот тот, который я написал для Java на основе алгоритма Marsaglia XORShift, который вы, вероятно, могли бы адаптировать. Прекрасно работает для моих целей (разработка игр, моделирование).

/**
 * State for random number generation
 */
private static volatile long state=xorShift64(System.nanoTime()|0xCAFEBABE);

/**
 * Gets a long random value
 * @return Random long value based on static state
 */
public static final long nextLong() {
    long a=state;
    state = xorShift64(a);
    return a;
}

/**
 * XORShift algorithm - credit to George Marsaglia!
 * @param a Initial state
 * @return new state
 */
public static final long xorShift64(long a) {
    a ^= (a << 21);
    a ^= (a >>> 35);
    a ^= (a << 4);
    return a;
}
2
ответ дан 4 December 2019 в 12:59
поделиться

Поскольку вы не особо много говорили о своей реализации, то использование многопоточной функции с использованием функции, использующей глобальное состояние, почти всегда является плохой идеей. Многие реализации затем просто используют мьютексы для защиты одновременного доступа. Долгое время, которое вы наблюдали бы тогда, было бы просто временем ожидания, а не вычислением самой функции rand. В POSIX есть семейство функций rand48, которые также имеют реентерабельные версии, которые должны лучше работать при параллельном доступе, см. http://opengroup.org/onlinepubs/007908799/xsh/drand48.html

1
ответ дан 4 December 2019 в 12:59
поделиться

Считается, что Mersenne Twister быстрее многих реализаций RAND, но YMMV зависит от деталей реализации и оборудования.

0
ответ дан 4 December 2019 в 12:59
поделиться

Вы можете использовать некоторые предварительно рассчитанные значения для случайных чисел и хранить их в некоторых массивах. Алгоритмы RNG - не очень простая задача. На мой взгляд, это решение, если вам нужно небольшое количество случайных чисел.

Обычно в играх выполняется много предварительных вычислений (значения sin / cos и другие вещи, которые очень часто используются в видеоиграх, и они потребляли бы много циклов процессора, если бы не были предварительно рассчитаны).

Вы также можете посмотреть HW RNG , но я считаю, что об этом не может быть и речи.

2
ответ дан 4 December 2019 в 12:59
поделиться

Возможно, это не лучший ответ, и это скорее вопрос.

В зависимости от платформы и частоты, зависящей от значения, не будут ли наименее значащие числа микросекундной возвращающей функции приближаться к чему-то «случайному»?

0
ответ дан 4 December 2019 в 12:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: