2014-09-05 88 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