Случайно генериране на int от съществуващ int

Помислете за следното 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. Какъв е вашият случай на употреба? Имате ли нужда от различно генерирано трицифрено int за всяко по-голямо цяло число, което подавате? Ако е така, изоставете задачата си - невъзможно е (вижте принципа на Pigeonhole). Ако не, проста модулна операция (както Дирк предлага) ще свърши добре работата.   -  person Michael Petrotta    schedule 20.02.2012
comment
Ами входът int, който всъщност използвам, е SHA1 хеш, преобразуван в BigInteger и представен като String. Хешът се поставя в байт [], тези байтове след това се поставят в BigInteger. Просто реших да започна с по-малък пример :)   -  person Tony    schedule 20.02.2012


Отговори (3)


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

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

Ако желаете псевдослучайно modifiedNumber, което се променя за всяко поколение, можете да използвате време в милисекунди:

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

Надявам се да помогне.

вал

person Valéry Stroeder    schedule 19.02.2012
comment
Горният код може да генерира 1 или 2 цифрено число. Можете да наложите 3-цифрено число с някакъв код като този: code if(modifiedNumber ‹ 100) { modifiedNumber=modifiedNumber*10; } if(модифицирано число ‹ 100) { модифицирано число=модифицирано число*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 входове, ако всичко, което търсите, е хеш в таблица.

Въпреки това, ако търсите трансформация, при която 3-цифреното число има малка или никаква връзка (което означава, не само модул ...) с входа, ще ви трябва някакъв начин да вкарате всички битове в резултата. Ако случаят е такъв, бих предложил трансформация като CRC16. Въведете стойността SHA1 в любимата си рутина CRC16, след което върнете стойността по модул 1000 от това, като имате предвид, че някои резултати ще се показват по-често от други.

person Julie in Austin    schedule 19.02.2012