Цикл по списку с использованием случайного диапазона с Python

1

Я новичок в Python, поэтому, пожалуйста, извините меня, если этот вопрос очень прост, но я попытался выполнить поиск и не нашел способа реализовать что-то подобное.

Я выполняю цикл из двух чисел, используя случайный шаг, и распечатываю некоторую информацию о них. Вот мой код:

from random import randint

#generate random number between 200 and 400
step = randint(200,400)
num = 0

for x in range(440000,450000,step):
    num = num + 1
    print("{}: {}km, increased by {}km".format(num,x,step))

Я хочу иметь возможность распечатать переменную шага и изменить ее (случайным образом) для каждой итерации цикла, однако код дает мне только одно значение, повторяющееся для каждой итерации. Вот пример вывода:

1: 440000km, increased by 274km
2: 440274km, increased by 274km
3: 440548km, increased by 274km
4: 440822km, increased by 274km
5: 441096km, increased by 274km
6: 441370km, increased by 274km
7: 441644km, increased by 274km
8: 441918km, increased by 274km
9: 442192km, increased by 274km
10: 442466km, increased by 274km
11: 442740km, increased by 274km
12: 443014km, increased by 274km
13: 443288km, increased by 274km
14: 443562km, increased by 274km
15: 443836km, increased by 274km
16: 444110km, increased by 274km

Как я могу сделать мой цикл действительно случайным? Любая помощь будет оценена по достоинству.

Спасибо!

  • 0
    Если я правильно понимаю, вам нужно только поместить ваш шаг var (где вы определяете случайный шаг) внутри цикла, сразу после оператора for.
  • 0
    @BossaNova Нет, этого недостаточно, поскольку step больше не определяется при использовании в цикле for. В while подход подходит здесь, см. Ответ Жана-Франсуа Фабра ниже.
Теги:
python-3.x

4 ответа

3
Лучший ответ

вы не можете сделать это с циклом for так как range принимает начальный шаг (путаница часто возникает из-за этого из-за C/C++ for устаревания цикла, где возможно изменить шаг или текущий индекс в цикле).

Я бы с классическим в while цикла:

from random import randint

#generate random number between 200 and 400
num = 0

x = 440000

while True:
    num += 1
    step = randint(200,400)
    x += step
    if x >= 450000:
        break
    print("{}: {}km, increased by {}km".format(num,x,step))

результат:

1: 440380km, increased by 380km
2: 440586km, increased by 206km
3: 440975km, increased by 389km
4: 441221km, increased by 246km
5: 441545km, increased by 324km
6: 441803km, increased by 258km
7: 442080km, increased by 277km
8: 442476km, increased by 396km
9: 442822km, increased by 346km
10: 443179km, increased by 357km
11: 443536km, increased by 357km
12: 443779km, increased by 243km
13: 444170km, increased by 391km
14: 444449km, increased by 279km
15: 444791km, increased by 342km
16: 445023km, increased by 232km
...
28: 449154km, increased by 348km
29: 449431km, increased by 277km
30: 449647km, increased by 216km
31: 449890km, increased by 243km

Я не был уверен в контроле над лимитом, поэтому я воздержался от выполнения в while x < 450000, вместо этого я использовал бесконечный цикл, чтобы добавить и проверить позже (иначе, я чувствую, что не смогу "эмулировать", цикл for.

  • 0
    Спасибо за вашу помощь, я собираюсь еще раз взглянуть на циклы while.
  • 0
    Проверка лимита работает нормально, если вы упомянули x <= 45000. Я действительно использовал это в своем ответе - но вы меня опередили :)
0

Это связано с тем, что вы определяете шаг впереди вычисления и вычисляетесь только один раз. Ваш код дает фиксированное значение шага 274 каждый раз, когда цикл выполняется.

В этом случае цикл не идеален (хотя кто-то может предоставить решение). Вы можете использовать цикл while в этом случае, чтобы получить желаемый результат.

start = 440000 # this will be the starting km
num = 1        # Counter

while start <= 450000: # End value is 450000 km
    step = randint(200,400)       # This calls a new random int for each loop
    print ("{}: {}km, increased by {}km".format(num,start,step))
    start = start + step          # add start and step to give new start km
    num = num + 1                 # increment counter
  • 1
    Спасибо за ваш ответ, я очень ценю ваши комментарии к коду!
  • 0
    Рад помочь :) Пожалуйста, не стесняйтесь голосовать, если вам понравился ответ. Я мог бы использовать небольшой повторение XD
Показать ещё 2 комментария
0

В Python, когда вы хотите сделать что-то немного сложное в цикле for, часто стоит извлечь сложную часть в генератор.

from random import randint

def randstep(start, end, stepmin, stepmax):
    current = start
    yield current, 0
    while current < end:
        step = randint(stepmin, stepmax)
        current += step
        if current < end:
            yield current, step

for num, (x, step) in enumerate(randstep(44000, 45000, 200, 400)):
    print("{}: {}km, increased by {}km".format(num,x,step))

$ python3 t.py
0: 44000km, increased by 0km
1: 44338km, increased by 338km
2: 44587km, increased by 249km
3: 44954km, increased by 367km
$ python3 t.py
0: 44000km, increased by 0km
1: 44374km, increased by 374km
2: 44598km, increased by 224km
3: 44815km, increased by 217km

Поэтому для фактического цикла вам нужно использовать while, но вы можете извлечь цикл в генератор randstep который затем можно использовать в цикле for. Вы также хотели встречное num и есть уже генератор enumerate для этого, нет необходимости делать num = num + 1.

  • 0
    Я раньше не сталкивался с этим методом - вы дали мне больше читать. Очень признателен :)
0

Как определить значение шага внутри цикла?

Вы можете попробовать что-то вроде этого:

    from random import randint

#generate random number between 200 and 400
num = 0

for x in range(440000,450000,step):
    step = randint(200,400)
    num = num + 1
    print("{}: {}km, increased by {}km".format(num,x,step))

Таким образом, вы будете определять значение снова и снова, и это то, что вы хотите.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню