import random as rand class NumberGuesser(object): # Takes as argument a secret number between 0 and 99 def __init__(self, secret_number): assert(0 <= secret_number <= 100) self.secret = secret_number # Guesses until it finds the secret number and returns how many guesses it took def guess(self): raise NotImplementedError # Runs num_trials trials of guesses and returns the average number of guesses required def avg_guess_trial(self, num_trials): guesses = 0 for trial in range(num_trials): guesses += self.guess() return guesses/float(num_trials) # NumberGuesser that tries every number linearly from 0 to 99 class LinearGuesser(NumberGuesser): def guess(self): for i in range(100): if i == self.secret: return i class LinearRandomOrderGuesser(NumberGuesser): def guess(self): if rand.random() < .5: for i in range(100): if i == self.secret: return i else: guess_order = range(99, -1, -1) for i in range(len(guess_order)): guess = guess_order[i] if guess == self.secret: return i # NumberGuesser that guesses randomly until it gets it, will guess same numbers class RandomGuesser(NumberGuesser): def guess(self): current_guess = rand.randint(0, 99) num_guesses = 1 while current_guess != self.secret: current_guess = rand.randint(0, 99) num_guesses += 1 return num_guesses # NumberGuesser that guesses randomly, avoiding guessing the same number class NoRepeatRandomGuesser(NumberGuesser): def guess(self): guess_order = range(100) rand.shuffle(guess_order) for i in range(len(guess_order)): guess = guess_order[i] if guess == self.secret: return i