考虑以下int;
int start = 287729472784;
从那个int,我需要创建一个长度只有三位数的新int,我可以使用0-9中的任何值。
但是,为了创建新的int,我不能使用任何形式的已存在的随机数生成器。
我想知道是否可以使用模块化, xor ,和,位移 - 操作以某种方式减少数量。比如xor与前一个数字的最后一个数字,但我不确定这是否可能。
基本上我需要从起始int创建一个三位长的int,理想情况下将起始int减少到三位数。
我希望这是有道理的,我会感激任何意见。
由于
答案 0 :(得分:3)
不确定是否了解您的需求,但如果您希望从另一个号码生成3位数字,那么模数函数可能会对您有所帮助:
var startNumber = 287729472784;
var modifiedNumber = startNumber % 1000;
如果您希望每个代更改一个伪随机的modifiedNumber,您可以在几毫秒内使用时间:
var startNumber = 287729472784;
var modifiedNumber = startNumber * new Date().getTime() % 1000;
我希望它会有所帮助。
VAL
答案 1 :(得分:1)
嗯。我不明白这个问题,但是...... start % 1000
会产生start
的最不重要的3位数(但是要注意负值)?
答案 2 :(得分:1)
最佳答案实际上取决于最终号码的使用。由于SHA1的开始是合理的“随机”,因此使用%1000就足够了 - 如果您要查找的只是表中的哈希值,那么您将在所有可能的SHA1输入范围内获得良好的分布。
但是,如果你正在寻找一个转换,其中3位数字与输入之间几乎没有或没有关系(意思是,不仅仅是模数......),你需要一些方法将所有的比特打入结果。如果是这种情况,我建议使用CRC16这样的转换。将SHA1值输入您最喜欢的CRC16例程,然后返回其模数1000,记住某些结果会比其他结果更频繁地出现。