У вас есть несколько ошибок, я разработал их для вас и сейчас разберу их, работая над объяснением для всех частей, где вы ошиблись.
import random
def shuffle(some_ary, mixes):
d = len(some_ary) - 1
for i in range(mixes):
x = random.randint(0, d)
y = random.randint(0, d)
while y == x:
y = random.randint(0, d)
some_ary[x], some_ary[y] = some_ary[y], some_ary[x]
return some_ary
ary = [1,2,3,4,5]
print(f"Shuffle: {shuffle(ary, 10)}")
(xenial)vash@localhost:~/python/stack_overflow$ python3.7 shuffle.py
Shuffle: [5, 2, 3, 4, 1]
Первым делом первым:
def shuffle(ary):
ary = [1,2,3,4,5]
Вы декальцируете ary
внутри функции, нам нужно переместить это наружу, чтобы мы могли пройтиэто в функцию, используя suffle(ary)
d=len[ary]
b=d-1
Это должна быть одна строка d = len[ary] - 1
while (d > 0):
Теперь хорошие вещи :) Сначала у нас есть while(d > 0)
, если вы хотитечтобы использовать это, мы должны добавить что-то, что в конце концов завершит этот цикл, поэтому после каждого запуска добавляем d -= 1
, но даже в этом случае вы должны использовать for loop
вместо этого, что будет for i in range(mixes)
, нет необходимости использовать d
здесь, поскольку количество циклов действительно зависит от вас, чем выше вы идете, тем больше рандомизации мы получим.В этом примере давайте передадим mixes
вместе с нашим массивом.
Далее наш Shuffling:
x=random.randint(0,d)
В контексте вашего кода это было бы случайным между 0
и 5
, поскольку lists
начинается с 0
индекса, ваш текущий ary
имеет индексы с 0-4
, поэтому мы хотим, чтобы в этом диапазоне был случайный тип int, в вашем коде это было бы b
, поскольку b
было d - 1
.
if x == d:
Если это говорит о том, что if the random int == 5
, который находится вне диапазона индексов, позволяет, хотя ради этого предположить, что вы имели в виду 4
, все это только когда-либо даст наминдекс 4
, который нам не нужен для тасования, нам нужен случайный индекс, поэтому давайте избавимся от него.
Давайте вместо этого возьмем другую случайную переменную, чтобы поменять ее местами, поэтому мы всегда меняем два случайных числа
y = random.randint(0, b)
while y == x:
y = random.randint(0, b)
Здесь мы генерируем другое случайное число для индекса, но также следим за тем, чтобы оно не совпадало с тем, с которым мы меняемся местами
И, наконец, мы меняем местами:
ary[b],ary[x]=ary[x],ary[d]
Опять же, если мы используем этот метод, мы бы толькоr поменяйте местами последнюю цифру со случайной цифрой, и не говоря уже о том, что d
будет вне диапазона`
some_ary[x], some_ary[y] = some_ary[y], some_ary[x]
Вместо этого давайте поменяем две случайные позиции
И тогда мыможет:
results = shuffle(ary, 10)
print(results)
или
print(f"{shuffle(ary, 10)}")
Надеюсь, это поможет!:)