Python - Массив не будет перемешиваться и печатать - PullRequest
0 голосов
/ 18 сентября 2018
import random 

def shuffle(ary):

    ary = [1,2,3,4,5]
    d=len[ary]
    b=d-1
    while (d > 0):
        x=random.randint(0,d)
        if x == d: 
            ary[b],ary[x]=ary[x],ary[d]
    return ary

print("shuffle list" + str(shuffle(ary)))

Ответы [ 3 ]

0 голосов
/ 18 сентября 2018

FYI в случайном пакете есть предопределенная функция shuffle

import random
array = [1, 2, 3, 4]
random.shuffle(array) # shuffles in place
print("My shuffled list", array)

В вашем случае вам нужно определить массив, прежде чем передавать его вфункция

ary = [1, 2, 3, 4]
print(shuffle(ary))
0 голосов
/ 18 сентября 2018

У вас есть несколько ошибок, я разработал их для вас и сейчас разберу их, работая над объяснением для всех частей, где вы ошиблись.

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)}")

Надеюсь, это поможет!:)

0 голосов
/ 18 сентября 2018

Я не прошел через вашу логику.Просто исправил ваш код синтаксически.Вы прошли список без инициализации.Создал бесконечный цикл (никогда не уменьшал параметр d)

import random 
ary = [1,2,3,4,5]

def shuffle(ary):
    d=len(ary)
    b=d-1
    while (d > 0):
        x=random.randint(0,b)
        if x == d: 
            ary[b],ary[x]=ary[x],ary[d]
        d=d-1
    return ary

print("shuffle list" + str(shuffle(ary)))
...