Я реализую свой собственный генератор случайных чисел, и алгоритм, который я использую, дает мне метод nextLong()
. Однако, используя этот основной метод, мне нужно реализовать другие стандартные методы, такие как nextLong(long)
, nextInt()
, nextDouble()
и т. Д., С точки зрения nextLong()
. Например:Использование случайного долго для генерации случайных удвоений
public long nextLong(long n) {
long bits, val;
do {
bits = (nextLong() << 1) >>> 1;
val = bits % n;
} while (bits - val + n - 1 < 0L);
return val;
}
public int nextInt() {
return (int)nextLong();
}
Как можно использовать nextDouble
?
Целью этого является реализация ** обратимого генератора случайных чисел **, который реализует историю и методы для шага состояния генератора назад и вперед. Я исследовал подкласс «Случайный», чтобы сделать это, но казалось, что взломать попытку добавить все эти функции, просто переопределив «следующий». Отсюда отдельный класс. –
'((long) next (26) << 27) + next (27)' логически совпадает с 'next (53)', за исключением того, что метод 'next()' в 'Random' возвращает' int' , т.е. максимум 32 бит. 'next (53)' является таким же, как 'nextLong() & ((1L << 53) - 1)' или 'nextLong() >>> (64 - 53)', в зависимости от того, хотите ли вы с низкой или высокой 53 бит длинного. – Andreas