Olá!
Alguém sabe gerar números binários aleatórios?
Abraços
Olá!
Alguém sabe gerar números binários aleatórios?
Abraços
Um número binário é um número, portanto gere um número aleatório (use java.util.Random, por exemplo) e depois o converta para binário.
public class Teste {
public static void main(String []args){
Integer numeroBin;
numeroBin = new Integer( 1 + (int) (Math.random()*10));
String printNumero = numeroBin.toBinaryString(numeroBin);
System.out.println(numeroBin);
System.out.println(printNumero);
}
}
Obrigada, Edson e jcmird!
Mas não há uma forma de gerar sem fazer a conversão de decimal para binário? Porque, na verdade, estou tentando fazer um algoritmo genético e no inicio tenho que gerar uma população com 4 individuos (cromossomo) e cada individuo tem q ser um número binário.
Abraços
Eu fiz uma classe para representar genomas binários em algoritmos genéticos, para o SofiaIA.
Posso posta-la para você aqui. É feita em Java. No blog tem a versão dela em C++.
A vantagem é que ela usa a representação binária mesmo, e tem método que facilitam a conversão de bits específicos em números inteiros.
Por exemplo, você pode querer o inteiro que é representado pelos bits 8 até 16, com ou sem sinal.
Como prometido:
[code]import java.util.BitSet;
import java.util.Random;
/**
Represents a genome, with genes encoded as binary data. Provide useful
methods for setting and getting values into the binary string. Also, provide
a crossover and a mutation methods.
*/
public class BitGenome {
private BitSet genes;
/**
/**
/**
Sets the given number in the specified position using cont bits.
@param pos Position to set the number
@param number Number to set. The number range will vary from 0 to
(2^bits)-1
@param bits Number of bits that will be used to store this number.
*/
public void setUnsigned(int pos, long number, int bits) {
int max = ((2 << bits - 1) - 1);
if (number > max) {
throw new IllegalArgumentException("Invalid number " + number + "! Maximum value for " + bits + " bits is " + max + “!”);
}
if (number < 0) {
throw new IllegalArgumentException(“Unsigned numbers cannot be smaller than 0!”);
}
for (int i = pos + bits - 1; i >= pos; i–) {
genes.set(i, (number & 1) == 1);
number = number >> 1;
}
}
/**
Sets the given signed number in the specified position using count bits.
@param pos Position to set the number. The number range will vary from
-2^(bits-1)-1 to +2^(bits-1)-1
@param number Number to set.
@param bits Number of bits to use for storing.
*/
public void setSigned(int pos, long number, int bits) {
if (number < 0) {
setUnsigned(pos + 1, -number, bits - 1);
genes.set(pos);
return;
}
setUnsigned(pos + 1, number, bits - 1);
genes.clear(pos);
}
/**
Retrives the group of bits as a number, starting at the given position.
@param pos Position to start retrieving bits
@param bits Number of bits to retrieve.
@return An unsigned number, composed by all bits.
*/
public long getUnsigned(int pos, int bits) {
long num = 0;
for (int i = pos; i < pos + bits; i++) {
num = (num << 1) + (genes.get(i) ? 1 : 0);
}
return num;
}
/**
/**
/**
/** @return this genome size. */
public int size() {
return genes.length();
}
}[/code]
Você também pode gerar um BitGenome aleatório fazendo:
BitGenome genome = BitGenome.createRandom(10);
Onde 10 é o número de bits no genoma.
Oi, ViniGodoy!
Gostaria muito q vc postasse por aq.
Desde já agradeço muito.
Abraços
ViniGodoy,
Muito Obrigada!
Abraços
Acho que tenho uma versão mais atual dessa classe com números flutuantes também (float e double).
Se eu tiver, posto por aqui.
É, não tenho. Só o que tenho são diversos métodos de cruzamento, mutação, escala e seleção implementados. Como por exemplo, esse aqui:
package sofia.genetic.genome.bit.crossover;
import java.util.HashSet;
import java.util.Set;
import sofia.genetic.genome.bit.BitGenome;
import sofia.genetic.util.Two;
/**
* Implement a n-point cut crossover.
* The genome 0000000 combined with 1111111 with cuts in 2 and 5 will generate two offspring:
* <p>
* parent1 - 00|000|00 <br>
* parent2 - 11|111|11 <br>
* <p>
* offspring1 - 0011100
* offspring2 - 1100011
*/
public class PointCrossover implements BitCrossoverMethod {
private Set<Integer> cutSet;
/**
* Create a new a n-point cut crossover.
* The genome 0000000 combined with 1111111 with cuts in 2 and 5 will
* generate two offspring:
* <p>
* parent1 - 00|000|00 <br>
* parent2 - 11|111|11 <br>
* <p>
* offspring1 - 0011100
* offspring2 - 1100011
*
* @param number of cuts. Duplicate cuts will be discarded, as well as
* indexes outside the genome boundaries.
*/
public PointCrossover(int... cuts) {
if (cuts.length == 0) {
throw new IllegalArgumentException("Provide at least one cut!");
}
cutSet = new HashSet<Integer>(cuts.length);
for (int cut : cuts) {
cutSet.add(cut);
}
}
public Two<BitGenome> crossover(BitGenome genome1, BitGenome genome2) {
Two<BitGenome> mixins = new Two<BitGenome>(new BitGenome(genome1.size()),
new BitGenome(genome2.size()));
boolean flip = false;
for (int i = 0; i < genome1.size(); i++) {
if (cutSet.contains(i)) {
flip = !flip;
}
mixins.getOne().set(i, flip ? genome1.get(i) : genome2.get(i));
mixins.getTwo().set(i, flip ? genome2.get(i) : genome1.get(i));
}
return mixins;
}
}