2014-09-11 2 views
-2

Я пытаюсь создать монету трижды, используя цикл while, но здесь есть различные проблемы, и я не профессионал.Python while loop, coin toss 3 раза

Мой код не бежал так, как я хотел его запустить это только тестовый код сейчас ... вот вопросы:

  • это не зацикливание по какой-то причине, работает только один раз.

  • это только печатающие хвосты, никогда не печатающие головки.

  • я должен поставить еще заявление в начале строки каждый раз, когда для того, чтобы программа бежать, не дав мне недопустимое сообщение синтаксического ... почему ??

  • как я могу сделать его петля 3 раза точно?

ЛЮБАЯ помощь будет оценена по достоинству. Код ниже

import random 

heads_counter=0 tails_counter=0 

while heads_counter and tail_counter <= 3: 
    a= random.randint (1,2) 
    if a==1: 
     print ("heads",heads_counter) 
     heads_counter+=1 

else: 
    print ("tails",tails_counter) 
    tails_counter+=1 
+0

вы хотите, чтобы проверить редактирование представления вашего * фактический * индекс? Похоже, что редактирование, вводящее '>' s в начале блока кода, состояло в том, чтобы попытаться поместить отступ назад для вашего if/else, но не на 100% уверенно ... –

+0

@JonClements. '' '' С отступом inline с 'while' объяснил бы, почему всегда казалось, что он выбирает хвосты. (Вот как это появилось, когда я впервые редактировал вопрос.) – chepner

+0

@chepner yep ... более пристально смотря на редактирование OPs, он не вводил отступы ... так что я вернулся на ваш (опять) –

ответ

1

Ваша главная проблема состоит в следующем:

while heads_counter and tail_counter <= 3: 

Я предполагаю, что вы хотите что-то больше вдоль линий этого:

while heads_counter + tail_counter <= 3: 
    a= random.randint (1,2) 
    if a==1: 
     print ("heads",heads_counter) 
     heads_counter+=1 

    else: 
     print ("tails",tails_counter) 
     tails_counter+=1 

print ("heads total",heads_counter) 
print ("tails total",tails_counter) 

Помните: Отступы важны для Python.

Хотя спецификации петли: https://docs.python.org/3/reference/compound_stmts.html#the-while-statement

+0

спасибо за помощь – aero

0

Похоже, что проблема с отступом. Если ваш пункт else соответствует вашему if, он должен быть на том же уровне отступов, что и он.

Также ваше условие должно быть проверено на heads_counter <=3 and tail_counter <= 3, и ваша инициализация для ваших счетных переменных должна быть разделена, как указал Чеспер.

heads_counter = 0 
tails_counter = 0 

while heads_counter <= 3 and tail_counter <= 3: 
    a= random.randint (1,2) 
    if a==1: 
     print ("heads",heads_counter) 
     heads_counter+=1 
    else: 
     print ("tails",tails_counter) 
     tails_counter+=1 
1

Вы должны быть более явным в состоянии while:

while heads_counter <=3 and tail_counter <= 3: 

Ваш код всегда ложно, так как head_counter, инициализируется 0, является ложным. Этого достаточно, чтобы сделать полное условие and 'd ложным.

(Update: в kachingy123 указал, вы на самом деле хотите сравнить сумму двух переменных 3. Python является более точным, чем английский язык, который можно использовать «и» как синоним для «плюс».

while head_counter + tail_counter <= 3: 

)

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

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

import random 

heads_counter=0 
tails_counter=0 

# With update from kachingy123 
while heads_counter + tail_counter <= 3: 
    a = random.randint (1,2) 
    if a==1: 
     heads_counter += 1 
     print ("heads",heads_counter) 
    else: 
     tails_counter += 1 
     print ("tails",tails_counter) 
+1

Я думаю, что намерение из оригинального текста предусматривает только три флага монеты: «Я пытаюсь создать монету трижды, используя цикл while» – kachingy123

+0

Хорошо, я замалчиваю это. – chepner

+0

спасибо за ответ, хотя я пытаюсь, чтобы программа печатала только 3 тоска, а затем общее количество, но теперь оно включает 0 в счет, вот выход iam пытается получить :: ... Tossing ..... tail (2) Tossing ..... tail (2) Tossing ..... head (1) 1 голов и 2 хвоста Победитель: Tails – aero

1

Ваш «а» положение неверно.Заявление

while a and b <= c 

не оценивается как

while (a and b) <= c 

это имеет значение:

while (a) and (b <= c) 

В этом случае ваша переменная heads_counter, которая инициализируется в 0, следовательно, он оценивает к false, и ваша петля никогда не запускается

Кроме того, как отметил хелвуд, ваши уровни отступов находятся в верный. Ваше положение else должно быть отступом на том же уровне, что и соответствующий if п

+0

, так что вы говорите, мне нужны три vars вместо a? – aero

+0

Даже '(a и b) <= c' ошибочно, если бы он разбирался таким образом. – chepner

+0

Нет, в примере a, b, c являются просто заполнителями для того, что вы используете в своем условном выражении. Я просто пытался проиллюстрировать, как он оценивает утверждение. В вашем случае 'a' is' heads_counter', 'b' is' tails_counter', а 'c' - это константа, которую вы пытались проверить с – rdowell

1

Примечание по стилю:

Python имеет замечательную подробность, что несколько других языков матч. Используй это! Не делайте while a + b < 3, do for coinflip in range(3). Не делать result = random.randint(1,2), затем разобрать random в головы или хвосты, сделать result = random.choice("heads","tails"). Черт, запустите все сразу в одном большом списке и отсортируйте его позже!

Мои рекомендации:

import random 
results = {'heads':0, 'tails':0} 
for coinflip in range(3): 
    results[random.choice('heads','tails')] += 1 

что более просто

import random 
results = dict() 
for coinflip in range(3): 
    results.setdefault(random.choice('heads','tails'), 0) += 1 

или еще проще:

from collections import Counter 
import random 

Counter(random.choice('heads','tails') for flip in range(3)) 
+0

@chepner согласился, но это слишком длинный для комментария. Кроме того, форматирование кода и т. Д. В OP было много дублирующих ответов на проблемы с кодом, который он написал. Я не хочу писать другое. –