Вы можете использовать стандартную схему для таких задач: (a0 + Q*a1 + Q^2*a2 + Q^3*a3 + ...) % M
, где M
- очень большое простое число, а Q
- коэффициент по вашему выбору.
Если у вас есть достаточно случайный хэш в диапазоне [0, M)
, преобразование его в число с плавающей запятой [-1, 1]
становится тривиальным.
Или вы можете удалить % M
и разрешить целочисленное переполнение, хотя я не уверен, насколько он безопасен (с точки зрения «равномерно распределенного»).
Последовательность выходов из функции должна выглядеть как случайная последовательность, даже если входные числа являются последовательными.
Для этого вы можете вместо ai
использовать ai*ai
в выражении. В любом случае, вот простая реализация на Java.
double hash(int... a) {
int Q = 433494437;
int result = 0;
for (int n : a) {
result = result * Q + n * n;
}
result *= Q;
return (double) result / Integer.MIN_VALUE;
}
Вывод выглядит случайным даже для последовательных чисел. Вы также можете использовать 64-разрядное целое число для большей точности.