64 lines
1.2 KiB
C++
64 lines
1.2 KiB
C++
#include <cmath>
|
|
#include <cstddef>
|
|
|
|
#include "values/Dna.hpp"
|
|
|
|
namespace DNA
|
|
{
|
|
|
|
void newDna(Dna *dna, uint128 *state)
|
|
{
|
|
uint8_t *array = (uint8_t *)dna;
|
|
for (size_t i = 0; i < sizeof(Dna); i++)
|
|
{
|
|
array[i] = mrand::getValue(256, state);
|
|
}
|
|
}
|
|
|
|
void makeChild(Dna *p1, Dna *p2, Dna *c, uint128 *state)
|
|
{
|
|
uint8_t *p1a = (uint8_t *)p1;
|
|
uint8_t *p2a = (uint8_t *)p2;
|
|
uint8_t *ca = (uint8_t *)c;
|
|
for (size_t i = 0; i < sizeof(Dna); i++)
|
|
{
|
|
int val = mrand::getValue(2, state);
|
|
if (val == 0)
|
|
{
|
|
ca[i] = p1a[i];
|
|
}
|
|
else
|
|
{
|
|
ca[i] = p2a[i];
|
|
}
|
|
}
|
|
}
|
|
|
|
void clone(Dna *p1, Dna *c, uint128 *state)
|
|
{
|
|
uint8_t *p1a = (uint8_t *)p1;
|
|
uint8_t *ca = (uint8_t *)c;
|
|
|
|
for (size_t i = 0; i < sizeof(Dna); i++)
|
|
{
|
|
int val = mrand::getValue(2, state);
|
|
if (val == 0)
|
|
{
|
|
ca[i] = p1a[i];
|
|
}
|
|
else
|
|
{
|
|
ca[i] = mrand::getValue(256, state);
|
|
}
|
|
}
|
|
}
|
|
void mutate(Dna *dna, uint32_t num, uint128 *state)
|
|
{
|
|
uint8_t *array = (uint8_t *)dna;
|
|
for (size_t i = 0; i < num; i++)
|
|
{
|
|
int pos = mrand::getValue(sizeof(Dna), state);
|
|
array[pos] = mrand::getValue(256, state);
|
|
}
|
|
}
|
|
} |