Я хочу генерировать большое количество случайных данных, воспроизводимых для заданного ключа
, состоящего из списка чисел:
[a, b, c, d, e, ...]
Является ли следующее хорошим или разумным способом привести ГПСЧ в состояние для генерации случайных данных таким образом, чтобы для каждого n-кортежа [a, b, c, .... ..., n]
, эти данные некоррелированы с выходом для "соседних" n-кортежей [a+1, b, c, ..., n]
, [a, b+1, c, ..., n]
и т.д.
srand(a);
srand(rand() * b);
srand(rand() * c);
...
srand(rand() * n);
# generate random data:
for (int i=0; i < 100; +i)
printf("%d", rand());
Я думаю, этот вопрос сводится к следующему: является ли rand_hash
хорошей хэш-функцией для 2-кортежа (a, b)
?
int rand_hash(int a, int b) {
srand(a);
srand(rand() * b);
return rand();
}
NB: Я не хочу подразумевать, что srand
и rand
являются какой-либо конкретной реализацией RNG. Предположим ради аргумента, что мы используем хороший код Mersenne Twister.
Edit: Если не ясно, под "разумной хэш-функцией" я подразумеваю следующее. В ограниченном случае 2-кортежа [a, b]
, тогда выход rand_hash
должен быть равномерным в диапазоне int
, и (обычно) не должно быть корреляции между величиной изменения a
или b
и величиной изменения возвращаемого значения.