Случайно сгенерированные целые числа в списке одинаковы

У меня проблема с моим скриптом. Я хочу инициализировать генетический алгоритм, и в этом случае я хочу дать каждому первому элементу в строке случайное значение от 200 до 400.

import random

def InitiatePopulation(Population,AmountofSettings):
    Generation= [None]*Population
    sett = []
    for k in range(0,Population):
        for j in range(0,AmountofSettings):
            sett.append(300)
        Generation[k] = sett
    for _k in range(0, len(Generation)):
        Generation[_k][0] = random.randint(200,400)
        for _p in range(1, len(Generation[_k]),3):
            Generation[_k][_p] = 20
    return Generation

Всякий раз, когда я запускаю код, все первые значения являются одинаковыми значениями. Я попытался настроить начальное значение, но это не работает. Поскольку в прошлом у меня были проблемы с циклами for, проблема могла быть и в этом. Я понимаю, что код не обязательно эффективен, я просто хотел создать популяцию до настройки первой переменной настройки на случайное целое число.

Вот текущий вывод:

[[221, 20, 300, 300, 20, 300, 300, 20, 300, 300, 20, 300],
[221, 20, 300, 300, 20, 300, 300, 20, 300, 300, 20, 300]]

Ожидаемый результат будет таким же, за исключением того, что 221 значение будет отличаться друг от друга. Как я могу этого добиться?

Как вы называете этот метод? Вы хотите, чтобы остальные значения в массиве были одинаковыми во всех строках?

BrokenBenchmark 22.04.2022 19:49

Да, это касается только первого элемента. У меня есть экземпляры, которые рандомизируют весь массив, используя: Generation= [np.random.randint(0,1000,AmountofSettings).tolist() for _ in range(Population)] Но сейчас это не цель. В коде моего вопроса я ожидаю, что он запустится Generation[_k][0] = random.randint(200,400) дважды, потому что он находится в цикле в другой позиции массива. Что мне не хватает?

Diederik Huijsman 22.04.2022 19:52

@DiederikHuijsman Какой результат вы ожидаете от этого кода?

Sharim Iqbal 22.04.2022 19:54

@SharimIqbal Как и в вопросе, я ожидаю, что код Generation[_k][0] = random.randint(200,400) будет запущен дважды, таким образом, имея два случайных целых числа от 200 до 400 на первых позициях двух списков. Он добавляет только один случайный элемент 221 к обеим позициям.

Diederik Huijsman 22.04.2022 19:58
Анализ настроения постов в Twitter с помощью Python, Tweepy и Flair
Анализ настроения постов в Twitter с помощью Python, Tweepy и Flair
Анализ настроения текстовых сообщений может быть настолько сложным или простым, насколько вы его сделаете. Как и в любом ML-проекте, вы можете выбрать...
7 лайфхаков для начинающих Python-программистов
7 лайфхаков для начинающих Python-программистов
В этой статье мы расскажем о хитростях и советах по Python, которые должны быть известны разработчику Python.
Установка Apache Cassandra на Mac OS
Установка Apache Cassandra на Mac OS
Это краткое руководство по установке Apache Cassandra.
Сертификатная программа "Кванты Python": Бэктестер ансамблевых методов на основе ООП
Сертификатная программа "Кванты Python": Бэктестер ансамблевых методов на основе ООП
В одном из недавних постов я рассказал о том, как я использую навыки количественных исследований, которые я совершенствую в рамках программы TPQ...
Создание персонального файлового хранилища
Создание персонального файлового хранилища
Вы когда-нибудь хотели поделиться с кем-то файлом, но он содержал конфиденциальную информацию? Многие думают, что электронная почта безопасна, но это...
Создание приборной панели для анализа данных на GCP - часть I
Создание приборной панели для анализа данных на GCP - часть I
Недавно я столкнулся с интересной бизнес-задачей - визуализацией сбоев в цепочке поставок лекарств, которую могут просматривать врачи и...
1
4
60
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Похоже, проблема в том, что вы устанавливаете все элементы Generation как один и тот же список (т.е. ссылаетесь на одно и то же место в памяти).

Вам необходимо переназначить список новому пустому списку в начале каждой итерации:

for k in range(0,Population):
    sett = []
    for j in range(0,AmountofSettings):
        sett.append(300)
    Generation[k] = sett

В вашем коде есть проблема, длина вложенных списков не одинакова.

Sharim Iqbal 22.04.2022 20:00

большое спасибо. это именно то, что я имел в виду. Я думаю, что мои проблемы с пониманием того, как код Python изменяет ссылки, а не создает новые значения, мне все еще трудно понять... :)

Diederik Huijsman 22.04.2022 20:02

@SharimIqbal Исправлено.

BrokenBenchmark 22.04.2022 20:02

@DiederikHuijsman Нет проблем! Рад помочь. Не забудьте проголосовать за полезные ответы и принять тот, который вы считаете наиболее полезным.

BrokenBenchmark 22.04.2022 20:03

спасибо, что указали на это. Я уже исправил ошибку :)

Diederik Huijsman 22.04.2022 20:03

@BrokenBenchmark Да, теперь работает

Sharim Iqbal 22.04.2022 20:04

Я понимаю, что на него ответили, я просто предлагаю немного оптимизированное решение, если оно вам нужно. Я удалил 2 цикла for, и теперь это один цикл с внешним пониманием списка, поскольку его нужно запустить только один раз.

import random

def InitiatePopulation(Population, AmountofSettings):
    Generation = []
    sett = [20 if (x-1) % 3 == 0 else 300 for x in range(AmountofSettings)]
    
    for _ in range(Population):
        _sett = sett.copy()
        _sett[0] = random.randint(200,400)
        Generation.append(_sett)
               
    return Generation

print(InitiatePopulation(2, 12))

Другие вопросы по теме