Я делаю простой симулятор лотереи. У меня есть два взаимоисключающих флажка командной строки, поэтому либо программа выполняет количество ничьих, которые пользователь указывает, или пока вы не нажмете Джекпот.Условие в цикле FOR в Python
for i in range(args.draws):
perform lottery draws here
Как изменить для цикла таким образом, что если args.draws не дано должно бежать до джекпота удар. Я теперь недобросовестный на args.draws до очень большого числа так почти во всех случаях джекпот хит, а затем разорвать петлю, но есть лучший способ сделать это
Вот весь код. Это не очень. Я просто изучаю Python.
import random
import argparse
def oneoutof(occurance, times):
if occurance == 0:return 0
return float(times)/float(occurance)
if __name__ == '__main__':
LOTTERY_NUMBERS = [i + 1 for i in range(39)]
WIN_LIST =[0,0,0,0]
six_plus_one = 0
parser = argparse.ArgumentParser(description="[Lottery]\n"
"Example: python3 lottery.py ")
group = parser.add_mutually_exclusive_group()
group.add_argument("-s","--seven",action="store_true",
help="Stop when you hit 7 right")
group.add_argument("-d","--draws",type=int,default=1000000,
help="Stop after number of draws")
parser.add_argument("-n","--numbers", nargs=7, type = int,choices=range(1, 40),
help="Lottery numbers, if not given will be randomly selected")
args = parser.parse_args()
if args.numbers ==None:
print('You did not give lottery numbers so following numbers are randomly selected')
picked_numbers = set(random.sample(LOTTERY_NUMBERS, 7))
print(*picked_numbers)
print('Number of lottery draws is {:,}'.format(args.draws))
else:
picked_numbers = set(args.numbers)
print('Number of lottery draws is {:,}'.format(args.draws))
for i in range(args.draws):
lotto_numbers = set(random.sample(LOTTERY_NUMBERS, 7))
remaining_nbrs = set(LOTTERY_NUMBERS).difference(lotto_numbers)
extra_nmbs = set(random.sample(remaining_nbrs, 3))
correct_numbers = lotto_numbers&picked_numbers
correct_extranmbs = extra_nmbs&picked_numbers
if len(correct_numbers) > 3 and not (len(correct_numbers) == 6 and correct_extranmbs):
index = len(correct_numbers) - 4
WIN_LIST[index] = WIN_LIST[index] + 1
if len(correct_numbers) == 7 and args.seven:
print("You hit JACKPOT {} round".format(i))
break
elif len(correct_numbers) == 6 and correct_extranmbs:
six_plus_one=six_plus_one+1
print('4 correct %i times, one out of %g\n'
'5 correct %i times, one out of %g\n'
'6 correct %i times, one out of %g\n'
'6+1 correct %i times, one out of %f\n'
'7 correct %i times, one out of %f\n'
%(WIN_LIST[0],oneoutof(WIN_LIST[0], args.draws),
WIN_LIST[1],oneoutof(WIN_LIST[1], args.draws),
WIN_LIST[2],oneoutof(WIN_LIST[2], args.draws),
six_plus_one,float(args.draws)/float(six_plus_one) if six_plus_one else 0,
WIN_LIST[3],oneoutof(WIN_LIST[3], args.draws)))
Вы можете показать нам сами попробовать? – Kasramvd
@ d-coder Я откатил ваше редактирование, так как он сделал отступ в OPs неправильным ... будьте очень осторожны при изменении кодовых блоков (это очень редко вам нужно будет), поскольку вы полностью изменили значение кода OPs. –
@JonClements Oh! Сожалею. Это не было моим намерением. –