import%20marimo%0A%0A__generated_with%20%3D%20%220.15.3%22%0Aapp%20%3D%20marimo.App()%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20%23%20%25matplotlib%20inline%0A%20%20%20%20import%20matplotlib.pyplot%20as%20plt%0A%20%20%20%20import%20numpy%20as%20np%0A%0A%20%20%20%20plt.style.use(%22seaborn-v0_8-whitegrid%22)%0A%20%20%20%20return%20np%2C%20plt%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20r%22%22%22%0A%20%20%20%20%20%20%20%20We%20are%20solving%20the%20birthday%20problem%20using%20a%20Monte-Carlo%20simulation%2C%20e.g.%20given%20a%20class%20with%20%24m%24%20members%0A%20%20%20%20%20%20%20%20we%20run%20%24n%24%20experiments%20and%20count%20those%20of%20them%20with%20duplicates.%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(np)%3A%0A%20%20%20%20%23%20function%20to%20detect%20if%20there%20are%20any%20duplicates%20in%20x%0A%20%20%20%20def%20has_duplicates(x)%3A%0A%20%20%20%20%20%20%20%20%22%22%22Check%20if%20the%20input%20sequence%20contains%20any%20duplicate%20elements.%0A%0A%20%20%20%20%20%20%20%20Args%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20x%3A%20A%20sequence%20(list%2C%20array%2C%20etc.)%20to%20check%20for%20duplicates%0A%0A%20%20%20%20%20%20%20%20Returns%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20bool%3A%20True%20if%20duplicates%20exist%2C%20False%20otherwise%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20%20%20%20%20%23%20that's%20a%20standard%20trick%20in%20computer%20science%2C%20pump%20all%20entries%20of%20an%20array%2Fvector%2Fetc.%20into%20a%20set%20and%20count%0A%20%20%20%20%20%20%20%20return%20not%20(len(x)%20%3D%3D%20len(set(x)))%0A%0A%20%20%20%20def%20monte_carlo(m%3D5%2C%20n%3D100%2C%20s%3Dnp.arange(1%2C%20366))%3A%0A%20%20%20%20%20%20%20%20%22%22%22Perform%20Monte%20Carlo%20simulation%20for%20the%20birthday%20paradox%20problem.%0A%0A%20%20%20%20%20%20%20%20Args%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20m%3A%20Number%20of%20people%20in%20each%20experiment%20(default%3A%205)%0A%20%20%20%20%20%20%20%20%20%20%20%20n%3A%20Number%20of%20experiments%20to%20run%20(default%3A%20100)%0A%20%20%20%20%20%20%20%20%20%20%20%20s%3A%20Array%20of%20possible%20values%20to%20choose%20from%20(default%3A%20days%20of%20year%201-365)%0A%0A%20%20%20%20%20%20%20%20Returns%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20float%3A%20Probability%20of%20having%20at%20least%20one%20duplicate%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20%20%20%20%20%23%20create%20a%20matrix%20of%20size%20experiments%20x%20m%2C%20where%20each%20element%20is%20picked%20from%20an%20array%20s%0A%20%20%20%20%20%20%20%20a%20%3D%20np.random.choice(s%2C%20(n%2C%20m))%0A%20%20%20%20%20%20%20%20%23%20apply%20the%20function%20has_duplicates%20for%20each%20row%0A%20%20%20%20%20%20%20%20return%20sum(np.apply_along_axis(func1d%3Dhas_duplicates%2C%20arr%3Da%2C%20axis%3D1))%20%2F%20a.shape%5B0%5D%0A%20%20%20%20return%20(monte_carlo%2C)%0A%0A%0A%40app.cell%0Adef%20_(monte_carlo%2C%20np)%3A%0A%20%20%20%20x%20%3D%20np.arange(1%2C%2060)%0A%20%20%20%20y%20%3D%20np.array(%5Bmonte_carlo(m%3Da%2C%20n%3D5000)%20for%20a%20in%20x%5D)%0A%0A%20%20%20%20%23%20this%20isn't%20any%20faster%20but%20somewhat%20looks%20cleaner%3F%0A%20%20%20%20f%20%3D%20np.vectorize(monte_carlo)%0A%20%20%20%20y%20%3D%20f(x%2C%20n%3D5000)%0A%20%20%20%20return%20x%2C%20y%0A%0A%0A%40app.cell%0Adef%20_(plt%2C%20x%2C%20y)%3A%0A%20%20%20%20plt.plot(x%2C%20y)%0A%20%20%20%20plt.xlabel(%22Number%20of%20Elements%22)%0A%20%20%20%20plt.ylabel(%22Probability%20of%20at%20least%20one%20duplicate%22)%0A%20%20%20%20plt.title(%22Birthday%20Paradox%22)%0A%20%20%20%20plt.show()%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20%23%20For%20plotting%20in%20Python%20you%20could%20start%20here%3A%0A%20%20%20%20%23%20https%3A%2F%2Fjakevdp.github.io%2FPythonDataScienceHandbook%2F04.01-simple-line-plots.html%0A%0A%20%20%20%20%23%20For%20the%20Birthday%20problem%0A%20%20%20%20%23%20https%3A%2F%2Fen.wikipedia.org%2Fwiki%2FBirthday_problem%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20import%20marimo%20as%20mo%0A%20%20%20%20return%20(mo%2C)%0A%0A%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20app.run()%0A
ff1070dbba9c6ead9b7f50d95d37bf8acda73292be780bfa7bee3c46e1942943