Ваша проблема заключается в использовании rand
& srand
в программе на C ++.
srand(time(NULL));
unsigned chance = rand() % 5;
в этой реализации rand
может возвращать несколько чисел, которые дадут вам одинаковое окончательный результат. например: 19, 24, 190214, 49789, 1645879, 15623454, 4, 156489719, 1645234, 152349, ...
Существуют разные способы генерации случайных чисел в C ++, но этот не рекомендуется из-за плохих результатов.
Один (из многих) хороших способов генерации случайных чисел , используя «псевдослучайный» в C ++:
void Chromosome::generateGenes()
{
// Initialize random
std::random_device rd; // Will be used to obtain a seed for the random number engine
std::mt19937 gen(rd()); // Standard mersenne_twister_engine seeded with rd()
std::uniform_int_distribution<> dis(0, 5);
for (unsigned i = 0; i < 10; i++)
{
// Use random: dis(gen);
unsigned chance = dis(gen);
Chromosome::genes.push_back((!chance)? 1 : 0);
}
}
Включить:
#include <random>
Правильная нота @TedLyngmo: Каждый раз, когда будет вызываться эта функция (в вашем случае, в каждом создание объекта в вызове конструктора), этот код заставит вас сгенерировать новое случайное начальное число (в разделе «Инициализация случайного»). В большинстве случаев или по мере роста программы настоятельно рекомендуется извлечь эту инициализацию в другую функцию (и, возможно, в новый объект класса по причине модульного программирования). В этом ответе я продемонстрировал общий синтаксис использования этого типа случайных чисел в вашем случае.
Читайте о:
Генерация псевдослучайных чисел
Равномерное распределение
Благодаря @MM: Как кратко, портативно и тщательно посеять PRNG mt19937?