I'm getting the impression you might not quite be understanding what a genetic algorithm is. Forgive me if I'm wrong about that.
The idea generally is to change a value at the bit level. For instance if you had two parent values of 500 and 480, they are as follows in binary:
500 -> 0000 0001 1111 0100
480 -> 0000 0001 1110 0000
You then mate them by picking a point to splice them together which is essentially how DNA splicing works. If we picked the center in this case the child would become:
0000 0001 1110 0000
In this case the result is also 480 just like one of the parents, so whether the value becomes unique or not and different from either of the parents really depends. If instead the splice was done on the last 4 bytes you'd get this:
0000 0001 1111 <splice point> 0000
Here you get 496 which is between both parents and unique to both. This works well if you're homing in on a number between the parents, but if the number you really need is 29000 or something, you're going to be stuck waiting for a random mutation to just happen to land you in a better spot. That could take awhile. If the splice point is itself random, you've got 32 bits here to play with so in order to flip the first bit and get this:
1000 0001 1111 0000 -> decimal = 33264
...you might have to wait 32 * chancesOfAMutation generations to even see a number anywhere near that 29000 number that you really want.
Might you instead be doing it at the 32 byte boundaries, something like the following?
struct DNAStrand
{
float floatValue1
float floatValue2
.
.
.
}
And then create a child DNAStrand by mixing floatValue1 of parent 1 with floatValue2 of parent 2? If so, even though you may get a unique child now and then, floatValue1 and floatValue2 don't ever change except by mutation. In that case you aren't getting as much variation as you could be perhaps?
Anyway, there's a lot of things like this that could be going on in your simulation. Without more specific information or code, there's not much more I can say.
The idea generally is to change a value at the bit level. For instance if you had two parent values of 500 and 480, they are as follows in binary:
500 -> 0000 0001 1111 0100
480 -> 0000 0001 1110 0000
You then mate them by picking a point to splice them together which is essentially how DNA splicing works. If we picked the center in this case the child would become:
0000 0001 1110 0000
In this case the result is also 480 just like one of the parents, so whether the value becomes unique or not and different from either of the parents really depends. If instead the splice was done on the last 4 bytes you'd get this:
0000 0001 1111 <splice point> 0000
Here you get 496 which is between both parents and unique to both. This works well if you're homing in on a number between the parents, but if the number you really need is 29000 or something, you're going to be stuck waiting for a random mutation to just happen to land you in a better spot. That could take awhile. If the splice point is itself random, you've got 32 bits here to play with so in order to flip the first bit and get this:
1000 0001 1111 0000 -> decimal = 33264
...you might have to wait 32 * chancesOfAMutation generations to even see a number anywhere near that 29000 number that you really want.
Might you instead be doing it at the 32 byte boundaries, something like the following?
struct DNAStrand
{
float floatValue1
float floatValue2
.
.
.
}
And then create a child DNAStrand by mixing floatValue1 of parent 1 with floatValue2 of parent 2? If so, even though you may get a unique child now and then, floatValue1 and floatValue2 don't ever change except by mutation. In that case you aren't getting as much variation as you could be perhaps?
Anyway, there's a lot of things like this that could be going on in your simulation. Without more specific information or code, there's not much more I can say.