Как мне искать диапазон для единственного целого числа? - PullRequest
2 голосов
/ 02 августа 2010

Мой код 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 ]

4 голосов
/ 02 августа 2010

Прежде всего, пожалуйста, не называйте свою переменную random. Он скрывает имя модуля random, и вы не сможете использовать модуль random в остальной области видимости из-за этого.

Итак, назовем результат rnd.


Вы должны использовать if rnd in range(0, 16): ... вместо for. Синтаксис

for a in list_:
  foo(a)

будет извлекать каждый элемент в list_ один за другим, присваивать ему a каждый раз, а затем вызывать тело. Как видно из for, это петля . Таким образом, вы фактически устанавливаете winning = 0 17 раз и т. Д.

С другой стороны, синтаксис

if b in list_:
  foo(b)

, который можно увидеть как

if (b in list_):
  foo(b)

проверит, является ли b элементом list_, и выполнит тело, если условие выполнено ( in также является оператором .)


Не следует использовать in range(...), чтобы проверить, находится ли число в числовом диапазоне, потому что поиск в списке занимает линейное время. Pythonic способ заключается в использовании a <= b < c обозначения :

if 0 <= rnd < 16:
  winning = 0

Но на самом деле это можно записать проще (независимо от того, какой язык вы используете) как

if rnd < 16:
  winning = 0
elif rnd < 34:
  winning = 1
else:
  winning = 45
3 голосов
/ 02 августа 2010

Вы должны использовать 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 голосов
/ 02 августа 2010

Это немного продвинутая структура кода, но на самом деле не такая уж сложная.

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")
          )
2 голосов
/ 02 августа 2010

Использование 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) может возникать за много миль от истинной причины ошибки.

2 голосов
/ 02 августа 2010

Одна реализация того, что я думаю, вы хотите:

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
...