2014-09-05 99 views
0

我目前正试图生成一个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); 
} 

}

+0

为什么你乘的Math.random()* 0xFFFFFFFF的? – 2014-09-05 22:29:34

+0

获得0到0xFFFFFFFF之间的随机数 – OmniOwl 2014-09-05 22:30:11

回答

2

您指定0xFFFFFFFF,但是这是一个int文字,等于-1,使地板总是-1。使用L后缀指定long文字。 0xFFFFFFFFL不是-1作为long,这是2^32 - 1

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

的一对夫妇运行,种子是:

3186506811 
1401221963 
1537111640 
+0

实际上已经修复了它。虽然现在的字符串不再是64位,但这不是一个真正的问题。 – OmniOwl 2014-09-05 22:32:14

+0

地板始终是-1。它也可以是0. :)(+ 1'ed,因为那是我学会如此迂腐之后最少的) – yshavit 2014-09-05 22:35:57