2

我有一个具有以下代码的个人类

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;
        }

    }
}

如何编写一种方法将个人的整个值转换为十进制值?

4

3 回答 3

2

您似乎想创建一个随机的字节数组。但是您目前正在做的是生成一个 0 和 1 字节(不是位)的随机数组。您的所有字节(= 8 位)都是 00000000 或 00000001。您真正想要的是 0-255 范围内的字节。您应该使用Random.nextBytes(byte[]genes)来创建您的基因。

生成随机字节并将它们放入用户提供的字节数组中。产生的随机字节数等于字节数组的长度。)

然后你想把它转换回小数。但是,一旦您有超过 4 个字节,这些值将不再适合 32 位(=4 字节)整数。如果您有超过 8 个字节,它们将不适合 64 位整数等。

对于转换,我会使用BigInteger类。它会为您处理转换,因此您不必处理字节顺序

所以,假设你想要一个 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();
于 2013-10-19T12:10:04.450 回答
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(),或者如果您坚持使用 byte 数据类型:

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;
}
于 2013-10-19T12:09:47.677 回答
0

我认为 BigInteger 更合适。有一个随机生成,例如构造函数java.math.BigInteger.BigInteger(int numBits, Random rnd)。还有来自字节数组和toByteArray方法的构造函数。

于 2013-10-19T12:13:24.713 回答