伪随机生成器每次都返回相同的位

时间:2014-09-05 22:27:16

标签: java random

我目前正在尝试生成一个由字符串中的位表示的64位数字。

当我创建字符串时,我使用字符串的一部分来生成统计信息。但是,每次运行程序时,它都返回相同的统计数据,即使它应该是随机的。

所以我做了一些检查,看起来Seed总是以-1出现。我不知道如何解决这个问题,因为我在相当长一段时间内没有触及编码。

非常感谢帮助^ _ ^

public static void main(String[] args) {
    long seed = (long) Math.floor((Math.random() * 0xFFFFFFFF)); // <-- The issue
    long result = (0x5D588B656C078965L * seed) + 0x0000000000269EC3L;
    String s = Long.toBinaryString(result);
    System.out.println(s + "," + s.length());

    int spdef = Integer.parseInt(s.substring(2, 7), 2);
    int spatk = Integer.parseInt(s.substring(8, 13), 2);
    int speed = Integer.parseInt(s.substring(14, 19), 2);
    int def = Integer.parseInt(s.substring(20, 25), 2);
    int atk = Integer.parseInt(s.substring(26, 31), 2);
    int hp = Integer.parseInt(s.substring(32, 37), 2);

    System.out.println("spdef\tspatk\tspeed\tdef\tatk\thp");
    System.out.println(spdef + "\t" + spatk + "\t" + speed +
            "\t" + def + "\t" + atk + "\t" + hp);
}

}

1 个答案:

答案 0 :(得分:2)

您指定了0xFFFFFFFF,但这是一个int字面值,等于-1,所以最低限度为-1。请改为指定long字面值,后缀为L0xFFFFFFFFL不是-1 long,而是2 ^ 32 - 1.

long seed = (long) Math.floor((Math.random() * 0xFFFFFFFFL));

对于几次跑步,种子是:

3186506811
1401221963
1537111640