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

Я предполагаю, что запутанные имена могут быть прослежены до C , которые определили FLT_MIN как наименьшее положительное число.

Как в Java , где вы должны использовать -Double.MAX_VALUE, вы должны использовать -FLT_MAX , чтобы получить наименьший поплавок в C.

14
задан MrValdez 5 October 2008 в 05:50
поделиться

6 ответов

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

, Например :

uint32_t hash( uint32_t a)
    a = (a ^ 61) ^ (a >> 16);
    a = a + (a << 3);
    a = a ^ (a >> 4);
    a = a * 0x27d4eb2d;
    a = a ^ (a >> 15);
    return a;
}

Редактирование: Да, некоторые хеш-функции определенно выглядят более подходящими, чем другие.

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

21
ответ дан 1 December 2019 в 07:13
поделиться

Да, Вы ищете быстрый целочисленный хеш-алгоритм, а не PRNG.

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

Редактирование : исходная страница была удалена, активная версия может быть найдена на GitHub.

9
ответ дан 1 December 2019 в 07:13
поделиться

Вот маленький генератор случайных чисел, разработанный George Marsaglia. Он - эксперт в поле, таким образом, можно быть уверены, что генератор имеет хорошие статистические свойства.

v = 36969*(v & 65535) + (v >> 16);
u = 18000*(u & 65535) + (u >> 16);
return (v << 16) + (u & 65535);

Здесь u и v являются неподписанным ints. Инициализируйте их к любым ненулевым значениям. Каждый раз Вы генерируете случайное число, храните u и v где-нибудь. Вы могли перенестись, это в функции для соответствия подписи выше (кроме ints не подписаны.)

6
ответ дан 1 December 2019 в 07:13
поделиться

Если память не является действительно проблемой, и скорость имеет наибольшее значение тогда, что можно предварительно создать большой массив случайных чисел и просто выполнить итерации через него во времени выполнения. Например, имейте отдельную программу, генерируют 100 000 случайных чисел и сохраняют его как свой собственный файл как

неподписанный интервал randarray [] = {1,2,3....}

тогда включают тот файл в Вашу компиляцию, и во времени выполнения Ваша функция случайного числа только должна вытянуть числа от того массива и цикла назад к запуску, когда это поражает конец.

0
ответ дан 1 December 2019 в 07:13
поделиться

см. std::tr1::ranlux3, или другие генераторы случайных чисел, которые являются частью дополнений TR1 к стандартной библиотеке C++. Я предложил mt19937 initialially, но тогда видел Ваше примечание, что это должно быть очень быстро. TR1, должно быть доступным на Microsoft VC ++ и GCC и может также быть найден в библиотеках повышения, которые поддерживают еще больше компиляторов.

пример, адаптированный от документация повышения :

#include <random>
#include <iostream>
#include <iterator>
#include <functional>
#include <algorithm>
#include <ctime>
using namespace std;
using namespace std::tr1;
int main(){
    random_device trueRand;
    ranlux3 rng(trueRand);  // produces randomness out of thin air
                            // see pseudo-random number generators
    uniform_int<> six(1,6); // distribution that maps to 1..6
                            // see random number distributions
    variate_generator<ranlux3&, uniform_int<> >
           die(rng, six);   // glues randomness with mapping

    // simulate rolling a die
    generate_n( ostream_iterator<int>(cout, " "), 10, ref(die));
}

пример произвел:

2 4 4 2 4 5 4 3 6 2

Любой генератор случайных чисел TR1 может отобрать любой другой генератор случайных чисел. Если Вы нуждаетесь в более высоких качественных результатах, рассматриваете питание вывода mt19937 (который является более медленным, но более высоким качеством) в minstd_rand или randlux3, которые являются более быстрыми генераторами.

2
ответ дан 1 December 2019 в 07:13
поделиться

Я использую следующий код в моей библиотеке случайных чисел Java - у меня он очень хорошо сработал. Я также использую это для создания процедурного контента.

/**
 * 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 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;
}
0
ответ дан 1 December 2019 в 07:13
поделиться
Другие вопросы по тегам:

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