Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > Python
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.01.2024, 11:07   #1
kimyki
Новичок
Джуниор
 
Регистрация: 12.01.2024
Сообщений: 1
Печаль Помогите разобраться в проблеме;(

Есть задача: дан массив. Перемешать его элементы случайным образом так, чтобы каждый элемент оказался на новом месте.

Мой код:
from random import randint

arr = [1, 2, 3, 3, 0, 55]
new_arr = [i*0 for i in range(0, len(arr))]
#print(new_arr)

for j in arr:
index = randint(0, len(arr))
used = []
#print(index)
while len(used) < len(arr):
if new_arr[index] == 0 and index not in used:
used.append(index)
new_arr[index] = j
continue

print(new_arr)

Проблема: код ничего не выводит, подскажите, почему
kimyki вне форума Ответить с цитированием
Старый 12.01.2024, 12:24   #2
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,309
По умолчанию

1. После вставки кода выделите его и нажмите кнопку [CODE], которая находится над полем ввода.

2. Все элементы new_arr равны нулю и used пуст.
В этом случае условный оператор не срабатывает и условие цикла while не изменяется - вечный цикл.

3. Если использовать ваш алгоритм генерации массива индексов, то надо проверять, что новый индекс не только не содержится в used, но и не равен индексу текущего элемента массива arr.
Как вариант генерации нового массива индексов:
Код:
from random import randint

arr = [1, 2, 3, 3, 0, 55]
index = []
for i in range(len(arr)):
    n = randint(0, len(arr))
    while n == i or n in index:
        n = randint(0, len(arr))
    index.append(n)
print(index)
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 13.02.2024, 20:12   #3
rahul969
Новичок
Джуниор
 
Регистрация: 13.02.2024
Сообщений: 1
По умолчанию

Well, there are some logical error with your code, can you try below code, hope it can fix the error you are getting.

Код:
from random import randint

arr = [1, 2, 3, 3, 0, 55]
new_arr = [i * 0 for i in range(0, len(arr))]

for j in arr:
    index = randint(0, len(arr) - 1)  # Adjusted the index range
    used = []

    while len(used) < len(arr):
        if new_arr[index] == 0 and index not in used:
            used.append(index)
            new_arr[index] = j
            break  # Break the loop once the element is placed
        index = (index + 1) % len(arr)  # Move to the next index

print(new_arr)

Thanks
rahul969 вне форума Ответить с цитированием
Старый 13.02.2024, 23:15   #4
сфинкс
Форумчанин
 
Аватар для сфинкс
 
Регистрация: 17.06.2012
Сообщений: 957
По умолчанию

Предыдущие программы заданию не соответствуют
https://rextester.com/KOHVY26276 https://rextester.com/YOSN36237
оставляя значения на месте даже если проверять много раз

Есть моя многолетняя программа на языке высочайшего уровня Бэйсик
расставляющая элементы массива на заданное расстояние от исходного
например сейчас на 10% массива и пиша в файл для проверки

Код:
a = 9: DIM d(a): x=0: k=0: t$=CHR$(9): RANDOMIZE TIMER 'tas_10.bas
PRINT ,: FOR i = 1 TO a: d(i)=i: NEXT
FOR i = 1 TO 5: PRINT d(i);: NEXT: PRINT ,
FOR i = a-3 TO a: PRINT d(i);: NEXT: z = TIMER
OPEN "c:/contr10.txt" FOR OUTPUT AS #1 ' ram disk
WHILE x < 1
v = 0: FOR i = 1 TO a

1 m = INT(RND*a)+1: IF ABS(d(i)-d(m)) < .1*a THEN v = v+1: GOTO 1
PRINT #1, ABS(d(i)-d(m)); t$; d(i); t$; d(m); t$; i; t$; m; t$; d(i)/d(m); t$; d(m)/d(i)
t = d(i): d(i) = d(m): d(m) = t
NEXT

    s = 0: FOR i = 1 TO a
        IF d(i) = i THEN s = s+1
    NEXT
    5 k = k+1: PRINT: PRINT s; v,: IF s=0 THEN x = x+1

    FOR i = 1 TO 5
        IF d(i) = i THEN PRINT -d(i); ELSE PRINT d(i);
    NEXT: PRINT ,
    FOR i = a-3 TO a
        IF d(i) = i THEN PRINT -d(i); ELSE PRINT d(i);
    NEXT
WEND: PRINT: PRINT "    = "; k, TIMER-z: END
Код:
ABS    d(i)    d(m)       i      m       d(i)/d(m)      d(m)/d(i)

 41      70      29      91      18      2.413793      0.4142857
 59      24      83      92      38      0.2891566      3.458333
 14      32      46      93      44      0.6956522      1.4375
 23      10      33      94      88      0.3030303      3.3
 29      19      48      95      36      0.3958333      2.526316
 11      41      30      96      11      1.366667      0.7317073
 38       1      39      97      21      2.564103E-02      39
 60      26      86      98      55      0.3023256      3.307692
 17       4      21      99      58      0.1904762      5.25
 26      100     74     100      59      1.351351      0.74
Несмотря на непонятность и парадоксальность
вспомнил мой алгоритм повторяющиеся пишет со знаком минус

и мой искусственный интеллект включает нейросеть
и синтезирует ряды до упорядочения ячеек
Код:
1  2  3  4  5    6  7  8  9 
9  1  2  7 -5    4  3  6  8
2  5  1  9  4    3  6  7  8
Иногда часто бывают больше перестроений
и можете проверить на языке программирования qb64

Задав смещение на 20%
Код:
1  2  3  4  5     6  7  8  9
8  5  1  2  4     3 -7  6 -9
7 -2  5  9  1    -6  8  4  3
9  6  5  7  8     2  4  3  1
видим номера реально различаются на 20%

На другие языки программирования переводим сами
и возможно переведу себе когда-нибудь

Или учителя информатики могут задать ученикам

Проверка онлайн там нажать Execute https://jdoodle.com/ia/W86
Случайные и Массивы https://programmersforum.ru/showthread.php?t=344371 Учим C# & basic & excel & python https://programmersforum.ru/showthre...=327446&page=5 ничего нерекомендую

Последний раз редактировалось сфинкс; 14.02.2024 в 01:55.
сфинкс вне форума Ответить с цитированием
Старый 14.02.2024, 18:34   #5
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,309
По умолчанию

сфинкс
Цитата:
Предыдущие программы заданию не соответствуют
...
оставляя значения на месте даже если проверять много раз
Это вы о чём?
В моём примере:
Код:
while n == i or n in index:
явно указано, что новый индекс не может быть равен текущему.
Ежели вы и примере от rahul969, на который у вас ссылка, то зачем писать во множественном числе?

В задании:
Цитата:
Перемешать его элементы случайным образом так, чтобы каждый элемент оказался на новом месте.
Ваше предложение не соответствует по нескольким принципам:
1. Язык

2.
Цитата:
расставляющая элементы массива на заданное расстояние
Т.е. не случайный процесс расстановки элементов.

3. Можете подумать и самостоятельно решить, что вставить в этот пункт.

PS: Подсказка - Вопрос от ТС звучит так:
Цитата:
Проблема: код ничего не выводит, подскажите, почему
Ваше предложение не отвечает на вопрос ТС.
Как-то так, ...

Последний раз редактировалось ViktorR; 14.02.2024 в 18:37.
ViktorR вне форума Ответить с цитированием
Старый 15.02.2024, 03:53   #6
сфинкс
Форумчанин
 
Аватар для сфинкс
 
Регистрация: 17.06.2012
Сообщений: 957
По умолчанию

" расставляющая элементы массива на заданное расстояние "

имеется в вижу минимальное расстояние в большую сторону не ограниченное
как бы сфера вокруг ячейки где внутри повторяться запрещено

про язык дальновидно пишу мол любой переделает за час за месяц
да и исходная программа без отступов на питон не похожа

Цитирующий случайно забыл процитировать ссылку
на онлайно проверку https://rextester.com/YOSN36237

и там онлайн или оффлайн если стартовать несколько раз
какой-нибудь результат будет противоречащим

например задав исходный массив без повторов
arr = [5, 4, 3, 2, 1, 0]

обычный ответ [4, 5, 3, 2, 0, 1]
где видим остались на месте 3 и 2

или если важно начинать с 0 ответ [3, 1, 0, 4, 2, 5]
включает "1" будто на своём месте

зато мой квантовый искусственный интеллект и нейросеть и чатгпт
подобные ляпы не допускает

вчерашняя ссылка случайно не процитированная https://rextester.com/YOSN36237

Или https://ideone.com/gH76VV arr = [1, 2, 3, 3, 0, 55] выдаёт [5, 3, 0, 1, 2, 6]
Соответствует ли результат теме?

В идеале лучше выяснить какие значения ячейки занимать не могут
Случайные и Массивы https://programmersforum.ru/showthread.php?t=344371 Учим C# & basic & excel & python https://programmersforum.ru/showthre...=327446&page=5 ничего нерекомендую

Последний раз редактировалось сфинкс; 15.02.2024 в 04:06.
сфинкс вне форума Ответить с цитированием
Старый 15.02.2024, 17:19   #7
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,309
По умолчанию

Спасибо за замечание. Пришлось перепроверить.

В моём примере генерируется не сам массив а массив новых индексов.
К сожалению не учёл, что randint(a,b) генерирует в диапазоне [a,b].
Исправил код и добавил вывод перемешанного массива:
Код:
from random import randint

arr = [5, 4, 3, 2, 1, 0]
index = []
for i in range(len(arr)):
    n = randint(0, len(arr) - 1) # добавлено -1
    while n == i or n in index:
        n = randint(0, len(arr) - 1) # добавлено -1
    index.append(n)
print(index)


# Вывод перемешанного массива
arrn=[]
for i in index:
    arrn.append(arr[i])
print(arrn)
Код:
[2, 5, 1, 0, 3, 4] # массив индексов
[3, 0, 4, 5, 2, 1] # новый массив
Никакой элемент исходного массива не остаётся на старом месте.
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помощь в проблеме с MS WORD Alexander Gamza Microsoft Office Word 0 14.06.2017 15:38
Немогу разобраться в проблеме!!! yokozyna Помощь студентам 2 02.01.2013 14:21
Не могу разобраться...в проблеме... barakk Паскаль, Turbo Pascal, PascalABC.NET 0 19.12.2011 22:30
Прошу совета в проблеме Gans_sv Компьютерное железо 5 08.11.2009 20:27
Проблеме при смена размера Timage AnTe Мультимедиа в Delphi 3 13.04.2009 05:28