Это невозможно. Многие верхние границы могут давать одинаковый результат. Например, быстрый тест на Ideone показывает 9 возможных границ под 1000000, которые дали бы результат 235 с начальным значением 532 (а 800 не является одним из них): 237, 369, 711, 3239, 9717, 29151, 50549, 151647 и 454941.
import java.util.*;
class Test
{
public static void main (String[] args) throws java.lang.Exception
{
List<Integer> bounds = new ArrayList<Integer>();
for (int i = 1; i < 1000000; i++) {
Random rng = new Random(532);
if (rng.nextInt(i) == 235) {
bounds.add(i);
}
}
System.out.println(bounds);
}
}
Лучшее, что вы можете сделать, это определить возможные границы. Реализация nextInt(int)
- это , требуется , чтобы быть эквивалентным
public int nextInt(int bound) {
if (bound <= 0)
throw new IllegalArgumentException("bound must be positive");
if ((bound & -bound) == bound) // i.e., bound is a power of 2
return (int)((bound * (long)next(31)) >> 31);
int bits, val;
do {
bits = next(31);
val = bits % bound;
} while (bits - val + (bound-1) < 0);
return val;
}
Способы, с помощью которых этот алгоритм дает конкретный вывод, можно разделить на три возможности:
bound
является степенью двойки
bound
не является степенью двойки, и цикл завершается на первой итерации
bound
не является степенью двойки, и цикл продолжается после первой итерации
Кейсы с степенью двойки bound
очень просты - просто попробуйте все кавычки bound
с степенью двойки, которые подходят к int
. Их всего 31. Вы можете оптимизировать это, но в этом нет особого смысла.
Случаи первой итерации без степеней двух можно обработать, вычислив значение, которое было бы next(31)
(что можно сделать, заполнив экземпляр Random
и вызвав next(31)
), и увидев какие значения bound
дадут правильное значение val
и прекратят работу.
Чтобы получить правильное значение val
, bound
должен быть в bits - val
больше, чем val
. (Иногда bits - val
будет 0, и любое целое число больше, чем val
пройдет.) Чтобы завершить задание, bits - val + (bound-1)
не должно переполняться. Таким образом, возможные границы, которые попадают в этот случай, представляют собой факторы bits - val
в пределах определенного диапазона, которые не являются степенями двух.
Что касается финального случая, мне не хочется проходить через него, так что это будет «оставлено в качестве упражнения для читателя». (Это самый сложный случай с такими трудностями, как выяснение того, какие значения bound
вызовут переполнение, если вы не знаете val
, и это займет больше времени, чем у меня.)