2012-02-19 95 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的值,记住一些结果会比其他结果更频繁地出现。