2013-10-19 33 views
2

我有了後續代碼字節數組十進制的Java

public class Individual { 

    static int DNA_lenght = 64; 
    private int fitness = 0; 

    private byte[] genes = new byte[DNA_lenght]; 

    public void initialise_individual(){ 

     for(int i = 0; i < DNA_lenght; i++){ 

      byte gene = (byte) Math.round(Math.random()); 
      genes[i] = gene; 
     } 

    } 
} 

一個個人類我怎麼能寫個人的整體價值轉換爲十進制值的方法?

+1

你想要做什麼?你的代碼在許多方面看起來是錯誤和奇怪的(使用Math.random())。爲什麼你會將DNA數據(顯然)變成一個十進制數值? – Kayaman

+0

我試圖寫一個遺傳算法,並使用Math.random()創建隨機染色體數組的隨機個人 – Gan

+0

如果我沒有錯,你想要將基因數組轉換爲一個deimal值? – UDPLover

回答

2

你似乎要創建的隨機字節數組。但是你現在正在做的是產生一個0和1個字節(不是位)的隨機數組。所有的字節(= 8位)是00000000或00000001.你真正想要的是一個0-255範圍內的字節。你應該使用Random.nextBytes(byte[] genes)來創建你的基因。

生成隨機字節並將它們放入用戶提供的字節數組中。產生的隨機字節數等於字節數組的長度。)

然後你想把它轉換回小數。但是,只要您有超過4個字節,這些值將不再適合32位(= 4字節)整數。如果你有超過8個字節,他們將不適合一個64位整數等。

對於轉換,我會使用BigInteger類。它會照顧你的轉換,所以你不必處理endianness

因此,假設你要的64 隨機的基因,你這樣做如下:

public static void main(String args[]){ 
     // create random object 
     Random r = new Random(); 

     int numBits = 64; 
     int numBytes = numBits/8; 

     // create the byte array 
     byte[] genes = new byte[numBytes]; 

     //fill it 
     r.nextBytes(genes); 

     //print it 
     System.out.println("byte array: " + genes); 

     //now convert it to a 64-bit long using BigInteger   
     long l = new BigInteger(bytes).longValue(); 

     //print it 
     System.out.println("long: " + l); 
    }  

當然,你也可以直接生成一個隨機的長值,通過使用:

Random r = new Random(); 
long longGenes = r.nextLong(); 

而將其轉換成字節數組,如果你真的需要一個:

byte[] genes = new BigInteger(longGenes).toByteArray(); 
+0

這太好了,那麼轉換爲int是什麼? – Gan

+0

使用BigInteger類添加它。你可以自己逐字節地進行轉換,但是你有更多的代碼,你需要關心[endianness](http://en.wikipedia.org/wiki/Endianness)。這就是爲什麼最簡單的方法就是使用BigInteger。對於32位數組,您可以使用BigInteger.intValue()。 – jmiserez

+0

增加了一些關於以相反方式執行此操作的信息。 – jmiserez

1

首先,爲什麼length拼寫lenght?其次,這將填充數組中的零,我認爲這不是你想要的。

for(int i = 0; i < DNA_lenght; i++){ 

     byte gene = (byte) Math.round(Math.random()); 
     genes[i] = gene; 
    } 

而是嘗試類似:

genes = new byte[64]; 
    new Random().nextBytes(genes); 

最後,你可以不唯一轉換長度64(所以512位)的字節數組轉換爲十進制值(double僅64位)。

更新

閱讀問題的意見後,我帶領相信你想64 轉換成十進制值。這是可能的,並且可以與new Random().nextLong()簡單地完成,或者如果你堅持使用字節數據類型:

genes = new byte[8]; 
// fill with random values 
new Random().nextBytes(genes); 
// convert to long 
long decimalValue; 
for (int i = 0; i < 8; i++) { 
    decimalValue <<= 8; 
    decimalValue += genes[i] & 0xff; 
} 
0

我認爲BigInteger更合適。有一個隨機的一代,如構造函數java.math.BigInteger.BigInteger(int numBits, Random rnd)。還有從字節數組和方法的構造函數。

相關問題