Разница генерации случайных чисел в Matlab и Python

Я новичок в питоне. Я пытаюсь реализовать генетический алгоритм, который я ранее реализовал в MatLab. Мне нужно создать несколько хромосом (особей) для моей начальной популяции. В MatLab я делал это с помощью функции rand, и она давала мне множество уникальных (или, по крайней мере, достаточно разных) начальных популяций. Но здесь, в питоне, я пробовал разные методы random, но среди 50 человек у меня только от 3 до 4 уникальных хромосом. Вот мой код Python в __main__.py:

for i in range(pop_size):
        popSpace.append(Chromosom(G=mG,M=mM))
        sum_Q+=popSpace[i].Q

И мой Chromosom класс:

class Chromosom:   
    def __init__(self,G,M):
            self.Q = 0
            self.V = []
            self.Chr = [0]*len(self.M)
            self.M= M
            self.G= G
            self.randomChromosom() 
            self.updateQ_Qs() 

    def randomChromosom(self):
        for m in range(len(self.M)):
            if (random.random()< 0.5):
                self.Chr[m] = 1
            else:
                self.Chr[m] = 0

Я также пытался получить случайные биты, но результаты все равно были такими же. Например, я использовал print(str(main.mRand.getrandbits(6)), чтобы увидеть результаты в консоли, и понял, что число дублируется слишком много. Есть ли способ создать более уникальные случайные числа? в MatLab тот же код с функцией rand работал хорошо (конечно, довольно медленно). Наличие такой близкой начальной популяции приводит к плохим результатам на следующих шагах (также я должен упомянуть, что проблема случайности также вызывает аналогичные мутации). Моя проблема в том, что существует так много похожих хромосом. Например, у меня есть несколько 01111001, что странно, учитывая вероятность их появления.


person Sajjad    schedule 10.03.2020    source источник
comment
Тогда более уникальное случайное число уже не является случайным. Можете ли вы также определить функцию updateQ_Qs(), что такое M и что такое G? Также python не работает как Matlab, вы не можете назначить Chr[m], если Chr пусто, поскольку Chr[m] не существует. Этот код должен возвращать ошибку. Предоставьте рабочий пример и дайте нам ожидаемый результат.   -  person obchardon    schedule 10.03.2020
comment
updateQ_Qs() — это моя фитнес-функция, которая возвращает значение с плавающей запятой для каждой хромосомы. Говоря более уникальным, я хотел упомянуть, что, например, у меня есть несколько хромосом с порядком генов 01111001, что странно (я отредактировал код).   -  person Sajjad    schedule 10.03.2020
comment
Вероятность наличия хотя бы двух идентичных серий (длиной 8) среди 50 серий равна 1-prod(1-[(0:49)/2^8]) = 99,41%, так что в этом нет ничего удивительного.   -  person obchardon    schedule 10.03.2020
comment
8 бит → 0÷255‹365 — не за горами парадокс дня рождения.   -  person gboffi    schedule 10.03.2020
comment
Я пробовал NumPy, но результаты не изменились.   -  person Sajjad    schedule 10.03.2020
comment
Почему вы сказали, что его вероятность равна 1-prod(1-[(0:49)/2^8])? Я думал, что вероятность выбора одного и того же человека k раз за 50 независимых итераций должна быть length(combntns([1:50],k))*1/256^k.   -  person Sajjad    schedule 10.03.2020
comment
Вероятно, в этом коде есть и другие проблемы. random.random - и другие функции в случайном порядке достаточно хороши для них, но код, который вы разместили здесь, поднимет AttributeError при попытке добраться до self.M, прежде чем назначить его на __init__. В противном случае код в Python очень мало идиоматичен — вероятно, вы получите один и тот же объект, содержащий данные о хромосомах более чем в одном экземпляре.   -  person jsbueno    schedule 11.03.2020
comment
Пожалуйста, попробуйте разработать минимальный, полный пример, демонстрирующий поведение, на которое вы жалуетесь - какой-нибудь отдельный скрипт, который мы могли бы просто вставить сюда и запустить. Иначе там помочь нечем.   -  person jsbueno    schedule 11.03.2020
comment
@Sajjad Как сказал jsbueno, написанный вами код никак не может работать так, как написано. И есть куча атрибутов метода, которые не используются. Приведите минимальный пример, скажем, со 100 результатами. При этом, это очень, очень, очень медленный подход. Использование пустого массива случайных чисел и вычисление всего сразу было бы намного быстрее.   -  person TheBlackCat    schedule 11.03.2020