【问题标题】:Random int generation from existing int从现有 int 随机生成 int
【发布时间】:2012-03-10 08:03:45
【问题描述】:

考虑以下int;

int start = 287729472784;

从该 int 中,我需要创建一个长度仅为三位数的新 int,我可以使用 0-9 之间的任何值。

但是,为了创建新的 int,我不能使用任何形式的已经存在的随机数生成器。

我想知道是否可以结合使用 modularxorandbit-shift- 以某种方式减少数量的操作。比如 xor 最后一个数字与它前面的数字,但我不确定这是否可能。

基本上我需要从起始 int 创建一个三位数的 long int,理想情况下将起始 int 的长度减少到三位数。

我希望这是有道理的,我将不胜感激。

谢谢

【问题讨论】:

  • 1.这在 Java 中不是有效的 int - 它太大了。 2. 你的用例是什么?您是否需要为传入的每个较大整数生成不同的三位数 int?如果是这样,放弃你的任务 - 这是不可能的(见Pigeonhole principle)。如果没有,一个简单的模运算(如 Dirk 建议的那样)将很好地完成这项工作。
  • public string intRand( int input ) { return "004"; }
  • 嗯,我实际使用的输入 int 是将 SHA1 哈希转换为 BigInteger 并表示为字符串。哈希被放入一个字节[],然后这些字节被放入一个 BigInteger。我只是想我会从一个较小的例子开始:)

标签: java xor modular


【解决方案1】:

嗯。我不明白这个问题,但是...start % 1000 会产生start 的最低有效 3 位数字(尽管:小心负值)?

【讨论】:

    【解决方案2】:

    不确定是否了解您的需求,但如果您唯一的愿望是从另一个数字生成一个 3 位数的数字,那么模函数可能会帮助您:

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

    如果您希望伪随机 modifiedNumber 为每一代都更改,您可以使用以毫秒为单位的时间:

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

    希望对你有帮助。

    价值

    【讨论】:

    • 以上代码可以产生1位或2位数字。您可以使用以下代码强制输入 3 位数字:code if(modifiedNumber code
    • 模数本身并不能保证数字的均匀分布。确切地说,数字 648-1000 的百分比会略低。
    【解决方案3】:

    最佳答案实际上取决于最终数字的使用。由于 SHA1 开始时相当“随机”,因此使用 % 1000 就足够了——如果您要查找的只是表中的哈希值,您将在所有可能的 SHA1 输入范围内得到很好的分布。

    但是,如果您正在寻找一个转换,其中 3 位数字与输入几乎没有关系(意思是,不仅仅是模数...),您需要一些方法来将所有位转换成结果。如果是这种情况,我建议使用 CRC16 之类的转换。将 SHA1 值输入您最喜欢的 CRC16 例程,然后返回模 1000 的值,请记住,某些结果会比其他结果更频繁地显示。

    【讨论】:

      猜你喜欢
      • 2014-05-21
      • 2011-12-14
      • 2011-09-07
      • 1970-01-01
      • 1970-01-01
      • 2020-06-17
      • 2022-01-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多