Генерация случайных целых чисел из существующих целых чисел

Рассмотрим следующее int;

int start = 287729472784;

Из этого int мне нужно создать новый int длиной всего три цифры, я могу использовать любое значение от 0 до 9.

Однако для создания нового int я не могу использовать какие-либо формы уже существующих генераторов случайных чисел.

Мне было интересно, можно ли использовать комбинацию операций modular, xor, and, bit-shift как-то уменьшить число вниз. Например, xor последней цифры с предыдущей, но я не уверен, что это вообще возможно.

В основном мне нужно создать трехзначный длинный int из начального int, в идеале уменьшив начальный int до трех цифр в длину.

Я надеюсь, что это имеет смысл, и я был бы признателен за любой вклад.

Спасибо


person Tony    schedule 19.02.2012    source источник
comment
1. Это недопустимый int в Java — он слишком большой. 2. Каков ваш вариант использования? Вам нужно другое сгенерированное трехзначное целое число для каждого большего целого числа, которое вы передаете? Если это так, отказывайтесь от своей задачи — это невозможно (см. принцип сортировки). Если нет, простая операция по модулю (как предлагает Дирк) прекрасно справится с этой задачей.   -  person Michael Petrotta    schedule 20.02.2012
comment
Ну, ввод int, который я на самом деле использую, представляет собой хэш SHA1, преобразованный в BigInteger и представленный в виде строки. Хэш помещается в byte[], затем эти байты помещаются в BigInteger. Я просто подумал, что начну с меньшего примера :)   -  person Tony    schedule 20.02.2012


Ответы (3)


Не уверен, что понимаете вашу потребность, но если ваше единственное желание - сгенерировать трехзначное число из другого числа, возможно, вам поможет функция по модулю:

var startNumber = 287729472784;
var modifiedNumber = startNumber % 1000;

Если вы хотите псевдослучайное модифицированное число, которое изменяется для каждого поколения, вы можете использовать время в миллисекундах:

var startNumber = 287729472784;
var modifiedNumber = startNumber * new Date().getTime() % 1000;

Надеюсь, это поможет.

вал

person Valéry Stroeder    schedule 19.02.2012
comment
Приведенный выше код может давать 1- или 2-значный номер. Вы можете принудительно ввести трехзначное число с помощью такого кода: code if(modifiedNumber ‹ 100) {modifiedNumber=modifiedNumber*10; } if(modifiedNumber ‹ 100) {modifiedNumber=modifiedNumber*10; }code - person Valéry Stroeder; 20.02.2012
comment
Один только модуль не гарантирует равномерного распределения чисел. Точнее, числа 648-1000 будут иметь несколько меньший процент. - person Voo; 20.02.2012

Хм. Я не понимаю проблемы, но... start % 1000 даст младшие 3 цифры числа start (однако: будьте осторожны с отрицательными значениями)?

person Dirk    schedule 19.02.2012

Лучший ответ действительно зависит от использования этого последнего числа. Поскольку SHA1 достаточно "случайны" для начала, использование % 1000 должно быть достаточным - вы получите хороший разброс по диапазону всех возможных входных данных SHA1, если все, что вам нужно, это хеш в таблице.

Однако, если вы ищете преобразование, в котором трехзначное число практически не имеет отношения (имеется в виду, а не только по модулю...) к входным данным, вам понадобится какой-то способ вставить все биты в результат. Если это так, я бы предложил преобразование, такое как CRC16. Введите значение SHA1 в вашу любимую процедуру CRC16, а затем верните значение по модулю 1000, имея в виду, что некоторые результаты будут отображаться чаще, чем другие.

person Julie in Austin    schedule 19.02.2012