2016-12-26 10 views
-1

ここで私の目標は、Winning Ticketと一致するチケットが見つかるまで、チケットを引き出し続けるようにプログラムを実行させることです。繰り返しチケットがなければこれはうまくいくだろうが、どうすればそれを実装するか分からない。パワーボールのルールに基づいてPythonで繰り返しの文字列(Tickets)を防ぐ方法は?

from __future__ import print_function 
from datetime import date, datetime, timedelta 
from random import randint 

count = 0 

class Ticket: 
#Powerball Lottery Ticket Class' 

    def __init__(Ticket, ball1, ball2, ball3, ball4, ball5, pb): 
      Ticket.ball1 = ball1 
      Ticket.ball2 = ball2 
      Ticket.ball3 = ball3 
      Ticket.ball4 = ball4 
      Ticket.ball5 = ball5 
      Ticket.pb = pb 

    def displayTicket(Ticket): 
      print ("Ticket: ", Ticket.ball1, Ticket.ball2, Ticket.ball3, 
        Ticket.ball4, Ticket.ball5, Ticket.pb) 

WinningTicket = Ticket(randint(0, 69), randint(0, 69), randint(0, 69), 
         randint(0, 69), randint(0, 69), randint(0, 26)) 
DrawnTicket = Ticket(randint(0, 60), randint(0, 60), randint(0, 60), 
        randint(0, 60), randint(0, 60), randint(0, 26)) 

#Winning Ticket 
print("Powerball Ticket") 
WinningTicket.displayTicket() 
print("----------------") 

#Draws a random ticket 
def randomTicket(): 
    DrawnTicket = Ticket(randint(0, 69), randint(0, 69), randint(0, 69), 
          randint(0, 69), randint(0, 69), randint(0, 27)) 
    DrawnTicket.displayTicket() 
    return Ticket 

#Draw Random Ticket Until DrawnTicket is = RandomTicket 
    while WinningTicket != DrawnTicket: 
    randomTicket() 
    count += 1 
    if WinningTicket == DrawnTicket: 
      break 

#Number of DrawnTickets 
print("Number of Drawn Ticket: ", count) 
+2

実際の宝くじに一致する数字が使用されているように見えるので、重複の可能性はごくわずかです。 :) – TigerhawkT3

答えて

1

、あなたは包括的に交換することなく、1から69に至るまでの数字から5個の乱数を描画する必要があり、あなたは包括的に1から26までの数字からの番号を描画する必要があります。ジャックポットを獲得するには、赤いパワーボール番号と一致し、最初の5つの数字を任意の順序で一致させる必要があります。つまり、並べ替えではなくコンビネーションを探していることを意味します。

これより、数字の組み合わせを調べるようにコードを調整し、__eq__()のマジックメソッドを定義して、比較演算子が意図した通りに動作できるようにしました。重複する番号を調べるには、基本的に数字のリストを格納するリストがあります。新しいリストを生成するときは、リストにないかどうかをチェックします。意図したとおりに

from __future__ import print_function 
from datetime import date, datetime, timedelta 
from random import randint 

count = 0 


class Ticket: 
    # Powerball Lottery Ticket Class' 

    def __init__(self, numbers): 
     self.wb = numbers[:5] 
     self.pb = numbers[5] 

    def displayTicket(self): 
     print("Ticket: ", self.wb[0], self.wb[1], self.wb[2], self.wb[3], self.wb[4], self.pb) 

    def __eq__(self, other): 
     if isinstance(other, Ticket): 
      return set(self.wb) == set(other.wb) and self.pb == other.pb 
     else: 
      return False 

checkedNumbers = [] 

# Draws a random ticket 
def randomTicket(): 
    numbers = [] 
    while True: 
     if len(numbers) < 5: 
      numbers.append(randint(0,69)) 
     else: 
      numbers.append(randint(0, 26)) 

     if numbers in checkedNumbers: 
      numbers = [] 
     elif len(numbers) == 6: 
      break 

    DrawnTicket = Ticket(numbers) 
    DrawnTicket.displayTicket() 
    checkedNumbers.append(numbers) 
    return DrawnTicket 


WinningTicket = randomTicket() 

checkedNumbers.remove([number for number in WinningTicket.wb] + [WinningTicket.pb]) 

# Winning Ticket 
print("Powerball Ticket") 
WinningTicket.displayTicket() 
print("----------------") 

# Draw Random Ticket Until DrawnTicket is = RandomTicket 
while True: 
    DrawnTicket = randomTicket() 
    count += 1 
    if WinningTicket == DrawnTicket: 
     break 


# Number of DrawnTickets 
print("Number of Drawn Ticket: ", count) 

プログラムが動作します:

は、ここでこれらの調整を反映したコードです。しかし、 TigerhawkT3が暗示しようとしていたように、このプログラムは と非常にの時間がかかります。あなたは無作為に番号を生成することにより、292,201,338の数字の組み合わせによって力を得ようとしています。これは、すべての組み合わせを増やすよりも重複をたくさん作成します。それでも、それはまだ長い時間がかかります。

+1

弱い質問の良い説明;クッキーを持っています。 – msw

+0

ありがとう。私はそれが非常に非効率的であることがわかりますが、私は非論理的で難しいプログラムを試して、Pythonを学ぼうとしています。 – codeLearnerCamel

関連する問題