2012-02-19 112 views
0

請考慮以下int;從現有int生成隨機int

int start = 287729472784; 

從這個INT,我需要創建新的int是隻有三個長度數字,我可以使用的任何值從0到9。

但是,爲了創建新的int,我不能使用任何形式的現有隨機數生成器。

我想知道是否有可能使用的組合模塊化XOR位移位 - 操作以某種方式減少的總數。如xor與之前的最後一個數字,但我不知道這是甚至可能的。

基本上我需要從起始int創建一個三位長的int,理想情況下將起始int減少到三位數的長度。

我希望這是有道理的,我會很感激任何輸入。

謝謝

+0

1.在Java中這不是一個有效的'int' - 它太大了。 2.你的用例是什麼?你需要爲每個傳入的較大整數生成一個不同的三位數int嗎?如果是這樣,放棄你的任務 - 這是不可能的(見[Pigeonhole原則](http://en.wikipedia.org/wiki/Pigeonhole_principle))。如果不是,一個簡單的模數運算(如Dirk所建議的)將很好地完成這項工作。 – 2012-02-19 21:24:57

+0

'public string intRand(int input){return「004」; }' – zellio 2012-02-19 21:28:16

+0

那麼我實際使用的輸入詮釋是一個SHA1哈希轉換成一個BigInteger並表示爲一個字符串。 將散列放入一個字節[],然後將這些字節放入BigInteger中。 我只是想我會從一個更小的例子開始:) – Tony 2012-02-19 21:29:10

回答

3

不是一定要了解你的需求,但如果你的唯一的心願就是生成另一個號碼3個位數也許是模數功能可以幫助你:

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

如果你希望一個僞randomn modifiedNumber那每一代的變化你可以使用時間以毫秒爲單位:

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

我希望它能幫上忙。

vaL

+0

上面的代碼可以產生1或2位數字。您可以強制一個3位數的數字,代碼如下: 'code' if(modifiedNumber <100){ modifiedNumber = modifiedNumber * 10; } if(modifiedNumber <100){ modifiedNumber = modifiedNumber * 10; }'code' – 2012-02-19 21:46:49

+0

模數本身並不保證數字的統一分佈。確切地說,數字648-1000的百分比略低。 – Voo 2012-02-19 21:48:08

1

嗯。我不明白這個問題,但是... start % 1000會產生start的最低有效3位數字(雖然:小心負值)?

1

最好的答案確實取決於最終號碼的使用。由於SHA1的開頭是合理的「隨機」,因此使用%1000應該足夠了 - 如果您正在查找的所有內容都是哈希表,則您將在所有可能的SHA1輸入範圍內得到很好的分佈。但是,如果您正在尋找一個轉換,其中3位數字與輸入關係很小或沒有關係(意思是,不僅僅是一個模數...),您需要某種方式來將所有位進入結果。如果是這樣的話,我會建議像CRC16這樣的轉換。將SHA1值輸入到您最喜愛的CRC16例程中,然後返回模1000的值,記住一些結果會比其他結果更頻繁地出現。