Ошибка empty range for randrange() (0, 0, 0)

Рейтинг: 1Ответов: 2Опубликовано: 15.05.2023

Подскажите пожалуйста, при запуске иногда вылезает ошибка:

empty range for randrange() (0, 0, 0) 

Она возникает, когда randrange считывает пустой список (наверное).

Не могу понять, откуда он берётся, прогонял через визуализатор - все ок, через пайчарм ошибка вылезает иногда.

Пустой список взяться не может так-то, потому что только 1 раз удаляется элемент, а потом, когда цикл for начинается заново, появляется начальный список и из него удаляется также 1 элемент (список меняется всегда только на 1 элемент, не на все).

Условие:

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

Выходные данные (могут быть и другие варианты):

Светлана Зуева - Борис Боков
Аркадий Белых - Светлана Зуева
Борис Боков - Аркадий Белых

Код:

import random
s=['Светлана Зуева', 'Аркадий Белых', 'Борис Боков']  # список имя/фамилия
proof=[]
for i in range(len(s)):
    timemas=list(s)  # список в котором нет s[i] элемента(ученика), чтобы не было повторок когда ученик является другом самого себя
    del timemas[i]
    while 1!=2:  # бесконечный цикл пока не найдем друга
        a=timemas[random.randint(0,len(timemas)-1)]  # когда у нас 2 элемента(последовательность от 0 до 2) - они записываются как 0 1(2 не считается), метод randint включает 2 и получается 3 элемента вместо 2. (тут друг находится)
        if a not in proof: # проверка, повторяется ли друг
            print(s[i],'-',a)
            proof.append(a)
            break

Ответы

▲ 2Принят

Ошибка происходит из-за того что выбирая для 1 элемента - 2 элемент, 3 элемент может быть только сам с собой. Вот правильная реализация:

import random

s = ['Светлана Зуева', 'Аркадий Белых', 'Борис Боков']  # список имя/фамилия

random.shuffle(s)

for i in range(len(s)):
    print(s[i], '-', s[(i + 1) % len(s)])

▲ 0

Ошибка "empty range for randrange()" возникает, когда пытаетесь сгенерировать случайное число из пустого диапазона. В вашем коде возможна ситуация, когда список timemas становится пустым, и при вызове random.randint(0, len(timemas) - 1) возникает указанная ошибка.

Попробуйте этот код, он должен решать вашу проблему.

import random

names = ['Светлана Зуева', 'Аркадий Белых', 'Борис Боков']

while True:
    random.shuffle(names)
    pairs = list(zip(names, names[1:] + [names[0]]))
    if all(pair[0] != pair[1] for pair in pairs):
        break
for pair in pairs:
    print(pair[0], "-", pair[1])