2013-10-19 42 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)。还有从字节数组和方法的构造函数。

相关问题