我有一个具有以下代码的个人类
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;
}
}
}
如何编写一个方法将个体的整个值转换为十进制值?
答案 0 :(得分: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();
答案 1 :(得分: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;
}
答案 2 :(得分:0)
我认为BigInteger更合适。有一个随机生成,例如构造函数java.math.BigInteger.BigInteger(int numBits, Random rnd)
。还有来自字节数组和toByteArray
方法的构造函数。