我的Python代码生成0到35之间的随机数,并将该数字存储为“随机”。我希望将'随机'与几个数字范围进行比较,以确定它属于哪三组,并根据“随机”组中的哪一组为“获胜”分配另一个值。这些组是:0-16,16- 34和34-36。 “获胜”总是会回归2。这是我到目前为止所尝试的内容。
import random #start python random number generator
random = random.randrange(36) #calls a random number between 0-35 and stores value
print random #test
for random in range(0, 16):
winning = 0
for random in range(16, 34):
winning = 1
for random in range(34, 36):
winning = 45
print winning #test
提前感谢您提供任何帮助!这是我第一次使用Python编程。
答案 0 :(得分:4)
首先,请不要为变量random
命名。它会隐藏random
模块名称,因此您将无法在其余范围内使用random
模块。
所以我们调用结果rnd
。
您应该使用if rnd in range(0, 16): ...
代替for
。语法
for a in list_:
foo(a)
将逐个提取list_
中的每个元素,每次将其分配给a
,然后调用正文。从the for
it is a loop可以看出。因此,您实际上设置了winning = 0
17次等等。
另一方面,语法
if b in list_:
foo(b)
可以看作是
if (b in list_):
foo(b)
将检查b
是否为list_
的元素,并在条件为真时执行正文(the in
is also an operator。)
您不应使用in range(...)
来检查数字是否在数字范围内,因为在列表中搜索需要线性时间。 Pythonic的方法是使用the a <= b < c
notation:
if 0 <= rnd < 16:
winning = 0
但实际上它可以更简单地编写(无论您使用哪种语言)
if rnd < 16:
winning = 0
elif rnd < 34:
winning = 1
else:
winning = 45
答案 1 :(得分:3)
您应该使用if
代替for
。 for
是一个循环关键字。
if random in range(0, 16):
winning = 0
实际上这不是range
的好用,因为它会生成所有数字的完整列表,然后检查每个数字以查看它是否等于random
。做一些简单的比较会更有效率:
if 0 <= random < 16:
winning = 0
# The above is a shorthand syntax for this:
# if 0 <= random and random < 16
答案 2 :(得分:2)
我认为你想要的一个实现:
def getWinning(number):
ranges = {
0: (0, 16),
1: (16, 34),
45: (34, 36)
}
for key in ranges :
low, high = ranges[key]
if low <= number < high:
return key
答案 3 :(得分:2)
使用bisect.bisect是替换if
语句的好方法:
import random
import bisect
num = random.randrange(36)
print num
grid=(0,16,34,36)
winning=bisect.bisect(grid,num)
winning=45 if winning==2 else winning
print(winning)
PS。不要拨打随机号码random
。这样做会破坏相同名称的模块(因此无法再次呼叫random.randrange
)。这导致了一个可能难以发现的错误,因为异常(AttributeError
)可能会远离错误的真正原因。
答案 4 :(得分:2)
这是一种高级代码结构,但实际上并没有那么复杂。
from random import choice
# Do list weighted by the winning chances
winning=[0]*16+[1]*18+[45]*2
for lottery in range(10):
win = choice(winning)
print("Round %i:\t" % (lottery+1) +
("You won $%i" % win if win
else "No win this time")
)