2010-08-02 40 views
2

我的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

你说:'''赢'总是返回2虽然“。你一定是错的。您发布的代码将始终打印'45'。 – 2010-08-03 00:02:16

回答

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 
+0

是的!谢谢!这很有效,并证实了我的初步猜测,如果能够奏效的话。 – Kevin 2010-08-02 19:12:15

+0

+0.1用于回答OP的问题,+0.9用于提供更pythonic(更好的一般)解决方案 – 2010-08-02 20:07:23

+0

@Kevin:要确认这种猜测,请尝试运行猜测的解决方案。 – 2010-08-03 00:03:44

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(...)来检查数字是否在数字范围内,因为在列表中搜索需要线性时间。在Python的方式是使用the a <= b < c notation

if 0 <= rnd < 16: 
    winning = 0 

但实际上它可以更简单地写(不管你使用哪种语言)作为

if rnd < 16: 
    winning = 0 
elif rnd < 34: 
    winning = 1 
else: 
    winning = 45 
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 
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)可能会在距离错误的真正原因数英里之外。

+0

当“随机数”≥34时,“获胜”应该是45,而不是2。 – kennytm 2010-08-02 18:56:58

+0

啊......这就是为什么发电机给我的问题。谢谢! – Kevin 2010-08-02 19:14:42

+0

谢谢,@KennyTM。 – unutbu 2010-08-02 19:28:02

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