Я получаю последовательность примерно последовательных целых чисел (поступающих из ключа базы данных), и я хочу отобразить каждое целое число в двойное число от 0 до 1 детерминистическим образом, чтобы результирующий набор всех двойных чисел был (близко к) равномерно распределены.В идеале это должно быть верно, даже после того, как было получено только небольшое количество целых чисел.
Отображение должно быть детерминированным, потому что оно может происходить несколько раз для каждого целого числа (на нескольких разных машинах), и результирующее двойное число должнобыть одинаковым каждый раз, когда происходит сопоставление.
Например, как должна выглядеть функция mapToDouble ниже?
final int start = 100000;
final int size = 2000;
final double[] results = new double[size];
for (int i = 0; i < size; i++) {
results[i] = mapToDouble(i + start)
}
// results is uniformly distributed
Наилучший подход, о котором я могу подумать, это что-то вроде:
double mapToDouble(final int i) {
final String s = new StringBuilder().append(i).append(".0").reverse().toString();
return new Double(s);
}
, который приблизительно равномерно распределен для наиболее значимых битов с относительно небольшим размером выборки, но может быть искажен для менее значимых битов.