Python:如何防止随机生成否定答案的问题

时间:2015-01-18 17:59:48

标签: python

我的任务是为小学生创建数学测验。这是我到目前为止所做的:

import random
import math

def test():
    num1=random.randint(1, 10)
    num2=random.randint(1, 10)

    ops = ['+', '-', '*']
    operation = random.choice(ops)

    num3=int(eval(str(num1) + operation + str(num2)))

    print ("What is {} {} {}?".format(num1, operation, num2))
    userAnswer= int(input("Your answer:"))
    if userAnswer != num3:
        print ("Incorrect. The right answer is {}".format(num3))
        return False
    else:
        print ("correct")
        return True

username=input("What is your name?")
print ("Welcome "+username+" to the Arithmetic quiz")

correctAnswers=0
for question_number in range(10):
    if test():
        correctAnswers +=1

print("{}: You got {} answers correct".format(username, correctAnswers))

我现在需要做的是让我的程序只创建积极答案的问题。例如,没有3-10=-7

我尝试过在网上搜索,但我找不到任何东西,所以我转向你们寻求帮助。任何帮助将不胜感激:)

5 个答案:

答案 0 :(得分:2)

我建议的是:

#Random code...

if num1<num2:
    num1, num2 = num2, num1

#Rest of program

因此3 - 7 = -4变为7 - 3 = 4

我建议这样做的原因是答案仍然与上一个等式相同,只是正面而不是负数,所以你仍在测试相同的数字。

答案 1 :(得分:1)

保留表达式左侧的较大数字,也使用运算符而不是eval:

from operator import add, sub, mul

def test():
    num1 = random.randint(1, 10)
    num2 = random.randint(1, 10)
    d = {"+": add, "-": sub, "*": mul}
    operation = random.choice(list(d)))
    num1 = max(num1, num2)
    num2 = min(num1, num2)
    num3 = d[operation](num1, num2)
    print("What is {} {} {}?".format(num1, operation, num2))
    userAnswer = int(input("Your answer:"))
    if userAnswer != num3:
        print("Incorrect. The right answer is {}".format(num3))
        return False
    else:
        print("correct")
        return True

username = input("What is your name?")
print("Welcome {} to the Arithmetic quiz".format(username))
correctAnswers = sum(test() for question_number in range(10))
print("{}: You got {} answers correct".format(username, correctAnswers))

或者@jonclements建议排序也会起作用:

num2, num1 = sorted([num1, num2]) 

另一方面,您应该使用try / except来验证用户输入并转换为int,否则第一个无法转换为int的值将会崩溃。

答案 2 :(得分:0)

您可以选择num21之间num1之间的数字,如:

num1=random.randint(1, 10)
num2=random.randint(1, num1)

num1 > num2

n1=random.randint(1, 10)
n2=random.randint(1, 10)
num1 = max(n1,n2)
num2 = min(n1,n2)

我会选择第一个选项。没有额外的变数,没有额外的行。

答案 3 :(得分:0)

在选择随机数的代码之后,你可以在循环中添加它:

while num3<0:
    num1=random.randint(1, 10)
    num2=random.randint(1, 10)

    ops = ['+','-','*']
    operation = random.choice(ops)
    num3=int(eval(str(num1) + operation + str(num2)))

每次答案为否定时,它都会进入此循环。这将确保程序退出循环时答案是肯定的。

答案 4 :(得分:0)

一行更改应该这样做: if num1 > num2: num3=int(eval(str(num1) + operation + str(num2))) else: num3=int(eval(str(num2) + operation + str(num1)))