Как говорит egosys, вам не следует удалять из массива, для которого вы выполняете итерацию.
Другая проблема в вашем цикле, который запускает "4.times do". Иногда женский массив пуст, поэтому возвращает размер 0; rand (0) - это случайное число с плавающей запятой> = 0 и <1. Использование этого в качестве индекса массива для пустого female_array возвращает nil, который затем передается mate. </p>
Но это не так. Вы перебираете male_array, используя каждый, но затем выбираете мужчину наугад. Это позволяет некоторым мужчинам спариваться более одного раза; других нет вообще. Точно так же, некоторые женщины достигают спаривания и размножаются более одного раза в каждой итерации, другие - вовсе нет. Это твое намерение?
Давайте сначала рассмотрим вопрос о сохранении всех мужчин и женщин в одном массиве. Это упростит вещи. Однако, поскольку вам иногда нужно найти всех самцов, а иногда и всех самок, мы сделаем для этого следующие методы:
def males(population)
population.find_all do |person|
person.male?
end
end
def females(population)
population.find_all do |person|
person.female?
end
end
Было бы более биологически точным, если бы мужчины и женщины были в паре случайным образом, но никто не может спариться более одного раза. Это довольно просто:
def random_pairs(males, females)
males.shuffle[0...females.size].zip(females.shuffle)
end
Тогда воспроизводство населения становится, просто:
def make_children(male, female)
# return an array of children
end
def reproduce(population)
children = []
random_pairs(males(population), females(population)).each do |male, female|
children << make_children(male, female)
end
children
end
Имея такие функции, выполнить 4 цикла воспроизведения будет так просто:
people = # ... generate your initial list of people of all sexe.
4.times do
people = reproduce(people)
end
Поскольку ни одна функция не изменяет передаваемые ей аргументы, у вас не возникнет проблем с побочными эффектами.
Больше можно было бы сделать в ОО-стиле, например, сделав Population первоклассным объектом и переместив в него функции "мужчины", "женщины", "random_pairs" и "размножение". Я оставлю это как упражнение для читателя.