I am trying to solve a version of the birthday paradox question where I have a probability of 0.5 but I need to find the number of people n where at least 4 have their birthdays within a week of each other.
I have written code that is able to simulate where 2 people have their birthdays on the same day.
import numpy import matplotlib.pylab as plt no_of_simulations = 1000 milestone_probabilities = [50, 75, 90, 99] milestone_current = 0 def birthday_paradox(no_of_people, simulations): global milestone_probabilities, milestone_current same_birthday_four_people = 0 #We assume that there are 365 days in all years. for sim in range(simulations): birthdays = numpy.random.choice(365, no_of_people, replace=True) unique_birthdays = set(birthdays) if len(unique_birthdays) < no_of_people: same_birthday_four_people += 1 success_fraction = same_birthday_four_people/simulations if milestone_current < len(milestone_probabilities) and success_fraction*100 > milestone_probabilities[milestone_current]: print("P(Four people sharing birthday in a room with " + str(no_of_people) + " people) = " + str(success_fraction)) milestone_current += 1 return success_fraction def main(): day =  success =  for i in range(1, 366): #Executing for all possible cases where can have unique birthdays, i.e. from 1 person to a maximum of 365 people in a room day.append(i) success.append(birthday_paradox(i, no_of_simulations)) plt.plot(day, success) plt.show() main()
I am looking to modify the code to look for sets of 4 instead of 2 and then calculate the difference between them to be less than equal to 7 in order to meet the question.
Am I going down the right path or should I approach the question differently?
The key part of your algorithm is in these lines:
unique_birthdays = set(birthdays) if len(unique_birthdays) < no_of_people: same_birthday_four_people += 1
Comparing the number of unique birthdays to the number of people did the work when you tested if two different people had the same birthday, but It wont do for your new test.
Define a new function that will receive the birthday array and return
False after checking if indeed 4 different people had the a birthday in a range of 7 days:
def four_birthdays_same_week(birthdays): # fill this function code def birthday_paradox(no_of_people, simulations): ...
(this function can be defined outside the
Then switch this code:
if len(unique_birthdays) < no_of_people: same_birthday_four_people += 1
if four_birthdays_same_week(birthdays): same_birthday_four_people += 1
Regarding the algorithm for checking if there 4 different birthday on the same week: a basic idea would be to sort the array of birthdays, then for every group of 4 birthdays check if the day range between them is equal or lower to 7:
if it is, the function can immediately return
(I am sure this algorithm can be vastly improved.)
If after scanning the whole array we didn’t return
True, the function can return