Перемешать список питонов без использования встроенной функции

1

Я работаю над написанием двух разных функций тасования.

Первая функция перетасовки должна принимать список и возвращать новый список с элементами, перетасованными в случайный порядок.

Это то, что я до сих пор сделал для первого тасования function-

def shuf(List):
    import random
    newList=[]
    for i in List:
        i=random.randrange(len(List))
        newList+=i
    return newList

Вторая функция перетасовки принимает список как параметр и перетасовывает список на месте.

Я знаю, как это сделать со встроенной функцией, но мне не разрешено использовать ее.

  • 3
    Не могли бы вы поделиться тем, что вы знаете, что именно не разрешено, и как далеко вы продвинулись в своей работе, чтобы написать эти две разные функции перемешивания?
  • 0
    Вы уже знаете алгоритмы, которые вы должны реализовать? С какими проблемами вы сталкиваетесь?
Показать ещё 4 комментария
Теги:
python-3.3

2 ответа

1

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

>>> import random
>>> def shuffle(array):
    copy = list(array)
    shuffle_in_place(copy)
    return copy

>>> def shuffle_in_place(array):
    array_len = len(array)
    assert array_len > 2, 'Array is too short to shuffle!'
    for index in range(array_len):
        swap = random.randrange(array_len - 1)
        swap += swap >= index
        array[index], array[swap] = array[swap], array[index]


>>> array = list(range(10))
>>> array
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> shuffle(array)
[7, 2, 3, 5, 8, 6, 0, 1, 9, 4]
>>> array
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> shuffle_in_place(array)
>>> array
[8, 3, 1, 6, 9, 7, 0, 4, 2, 5]
>>> 
  • 2
    Это плохая случайность, так как она предвзята. Например, если вы тасуете [0, 1, 2], он может производить только [1, 0, 2], [2, 1, 0] и [0, 2, 1].
  • 0
    Поскольку алгоритм смещен, массивы должны иметь более двух элементов. Он не предназначен для совершенства, но, по крайней мере, заставляет все ценности двигаться хотя бы один раз.
0

План: перейдите в список с начала, начиная с элемента 0; найдите новую случайную позицию для него, скажем, 6, положите значение 0s в значение 6 и 6s в 0. Перейдите к элементу 1 и повторите этот процесс и так далее через остальную часть списка

import random
iteration = random.randint(2, 100)
temp_var = 0
while iteration > 0:
    # We will be swapping the value of i for j.
    # And then setting j to what i was using the temp_var place holder.
    for i in range(1, len(my_list)): # have to use range with len()
        for j in range(1, len(my_list) - i):
            # Using temp_var as my place holder so I don't lose values
            temp_var = my_list[i]
            my_list[i] = my_list[j]
            my_list[j] = temp_var

        iteration -= 1

Ещё вопросы

Сообщество Overcoder
Наверх
Меню