Я сделал эту короткую анкету:

from random import randint

def pancakes():
    q = raw_input("Do you like pancakes?")
    if q == "yes":
        print("Great!")
    elif q == "no":
        print("Hmmm...")

def french_toast():
    q = raw_input("Do you like french toast?")
    if q == "yes":
        print("Oh!")
    elif q == "no":
        print("Same here!")

def random():
    num = 2
    while num > 0:
        random = randint(1, 2)
        if random == 1:
            num = num -1
            pancakes()
         elif random == 2:
             num = num -1
             french_toast()

random()

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

Так как я могу задать один и тот же вопрос только один раз?

0
Keretto 9 Янв 2017 в 11:01

3 ответа

Лучший ответ

Вместо цикла while я бы предложил использовать цикл for в сочетании с random.sample. Создайте заранее список функций для предоставления sample:

from random import sample

funcs = [french_toast, pancakes]
for func in sample(funcs, len(funcs)):
    func()

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

В качестве альтернативы, вы могли бы shuffle список (выполняется на месте) с random.shuffle, а затем выполнить итерацию по нему, что также будет быстрее (хотя скорость не должна быть главной проблемой здесь):

from random import shuffle

funcs = [french_toast, pancakes]
shuffle(funcs)
for func in funcs:
    func()

Поместите их в функцию, если это необходимо:

from random import shuffle

# use *funcs for passing arbitrary number of 
# functions as positional arguments.
def call_funcs_randomly(funcs):
    shuffle(funcs)
    for func in funcs:
        func()

И позвонить им:

call_funcs_randomly([french_toast, pancakes])

Как отмечается в комментарии, не используйте random в качестве имени функции, у него есть возможность маскировать модуль random, что приводит к странным ошибкам.

8
Dimitris Fasarakis Hilliard 9 Янв 2017 в 08:27

Как насчет этого для вашего последнего вопроса (random не является хорошим именем! вы можете перезаписать модуль с тем же именем [хотя у вас все хорошо, если вы сделаете это прямо сейчас])

def random_questions():
    eligible_questions = [pancakes, french_toast]
    while eligible_questions:
        question = random.choice(eligible_questions)
        eligible_questions.remove(question)
        question()

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

Это легко расширить, если вы хотите добавить больше вопросов.

Если подумать: shuffle версия в ответ Джима Фасаракиса-Хиллиарда намного чище!

1
Community 23 Май 2017 в 10:30

Я бы использовал random.sample ссылку. Просто создайте список показателей к вашим вопросам и пример 2 из них.

РЕДАКТИРОВАТЬ:

Кроме того, вы можете использовать random.shuffle ссылку:

random.shuffle(questions)
for question in questions:
    # process your random question once 
3
BloodyD 9 Янв 2017 в 08:11