如何在一个范围内搜索单个整数?

时间:2010-08-02 18:29:52

标签: python random range

我的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编程。

5 个答案:

答案 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代替forfor是一个循环关键字。

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")
          )