我做了这个简短的问卷:
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 :(得分:8)
我建议您将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
,导致奇怪的错误。
答案 1 :(得分:3)
我会使用random.sample
Link。只需为您的问题创建一个索引列表,然后对其中的两个进行抽样。
编辑:
另外,您可以使用random.shuffle
Link:
random.shuffle(questions)
for question in questions:
# process your random question once
答案 2 :(得分:1)
你的上一个问题怎么样(random
不是一个好名字!你可能会覆盖同名的模块[尽管你现在的方式很好])
def random_questions():
eligible_questions = [pancakes, french_toast]
while eligible_questions:
question = random.choice(eligible_questions)
eligible_questions.remove(question)
question()
将问题放在列表中,选择一个random.choice
,将其从列表中删除并执行。如果问题列表为空,请停止。这样每个问题都只选择一次。
如果您想添加更多问题,可以轻松扩展。
第二个想法:Jim Fasarakis-Hilliard's answer中的shuffle
版本更清洁了!