From b0ed9372341558460be73707dc88c3a350ad25ff Mon Sep 17 00:00:00 2001 From: AVerzier <46388943+AVerzier@users.noreply.github.com> Date: Thu, 12 Sep 2019 20:20:59 +0200 Subject: [PATCH 1/3] Use randint, for loops and python 3 "print" function --- frog-2.py | 38 -------------------------------------- frog.py | 27 +++++++++++++++++++++++++++ 2 files changed, 27 insertions(+), 38 deletions(-) delete mode 100644 frog-2.py create mode 100644 frog.py diff --git a/frog-2.py b/frog-2.py deleted file mode 100644 index c0b0eec..0000000 --- a/frog-2.py +++ /dev/null @@ -1,38 +0,0 @@ -def frog(final_dist=100,max=6): - - # I wrote this quickly in a pub - # Don't judge me - - total_dist = 1 - - while total_dist <= final_dist: - - import random - - cap = 10**max - - trials = 0 - total_leaps = 0 - - while trials <= cap: - - dist = total_dist - leaps = 0 - - while dist > 0: - this_jump = int(random.random()*(dist)+1) - dist -= this_jump - leaps += 1 - - total_leaps += leaps - - trials += 1 - - print "{0}\t{1}".format(total_dist,(total_leaps*1.0)/trials) - - total_dist += 1 - - return "DONE" - - - \ No newline at end of file diff --git a/frog.py b/frog.py new file mode 100644 index 0000000..c991afc --- /dev/null +++ b/frog.py @@ -0,0 +1,27 @@ +from random import randint + + +def frog(final_dist=100, cap=10**3): + + # I wrote this quickly in a pub + # Don't judge me + + for total_dist in range(final_dist+1): + + total_leaps = 0 + + for _ in range(cap): + + dist = total_dist + leaps = 0 + + while dist > 0: + this_jump = randint(1, dist) + dist -= this_jump + leaps += 1 + + total_leaps += leaps + + print(f"Total distance : {total_dist} -> Average number of leaps : {total_leaps/cap}") + + return "DONE" From 3531b523aaa564d3dd75f5c1e71d702cbb91b791 Mon Sep 17 00:00:00 2001 From: AVerzier <46388943+AVerzier@users.noreply.github.com> Date: Thu, 12 Sep 2019 22:01:32 +0200 Subject: [PATCH 2/3] Use numpy arrays, plot the results --- frog.py | 69 ++++++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 53 insertions(+), 16 deletions(-) diff --git a/frog.py b/frog.py index c991afc..4f80c12 100644 --- a/frog.py +++ b/frog.py @@ -1,27 +1,64 @@ -from random import randint +import numpy as np +import matplotlib.pyplot as plt -def frog(final_dist=100, cap=10**3): - # I wrote this quickly in a pub - # Don't judge me +randomGenerator = np.random.default_rng() # Require numpy v1.17+ - for total_dist in range(final_dist+1): - total_leaps = 0 +ite = 1000 # Number of loops for the average +maxDistance = 1000 - for _ in range(cap): - dist = total_dist - leaps = 0 +totalDist = np.arange(1, maxDistance) - while dist > 0: - this_jump = randint(1, dist) - dist -= this_jump - leaps += 1 +randomLeap = np.empty_like(totalDist) +totalLeaps = np.zeros_like(totalDist) - total_leaps += leaps +for i in range(ite): - print(f"Total distance : {total_dist} -> Average number of leaps : {total_leaps/cap}") + print(f" - Iteration {i+1}/{ite}", end="\r") - return "DONE" + distLeft = totalDist.copy() + + leaps = np.zeros_like(totalDist) + + stillLeaping = np.ones_like(totalDist, dtype=bool) + + while np.any(stillLeaping): + + randomLeap[stillLeaping] = randomGenerator.integers( + 1, distLeft[stillLeaping], endpoint=True) + + np.subtract(distLeft, randomLeap, where=stillLeaping, out=distLeft) + + leaps[stillLeaping] += 1 + + stillLeaping[distLeft == 0] = False # Arrived at the end + + np.add(totalLeaps, leaps, out=totalLeaps) + +print() + +averageLeaps = totalLeaps/ite + +A, B = np.polyfit(np.log(totalDist), averageLeaps, 1) + +print(f"Average number of leaps ≈ {A:.5}*ln(Total distance)+{B:.5}") + +plt.plot(totalDist, A*np.log(totalDist)+B, linewidth=2, label=f"y≈{A:.5}*ln(x)+{B:.5}") + +plt.scatter(totalDist, averageLeaps, s=2, marker="*", color="green") + +plt.grid(True) + +# plt.xscale("symlog") + +plt.xlabel("Total distance") +plt.ylabel("Leaps") + +plt.legend() + +plt.title("Average number of leaps") + +plt.show() From 54049579434990788585e084935551837174c7bb Mon Sep 17 00:00:00 2001 From: AVerzier <46388943+AVerzier@users.noreply.github.com> Date: Thu, 12 Sep 2019 22:06:28 +0200 Subject: [PATCH 3/3] Update README.md --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index fda46c1..a746b50 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # frog_problem -Here is the frog problem code I wrote in an Edinburgh pub. -Feel free to make better version. This one has not changed since I wrote it. V1 was the same code but saved before I changed it to work for different distances so I have not bothered upload it as well (it was still very unifinished). +It uses numpy arrays to simulate multiple frogs. +The answer to how many jumps the frog needs to do to reach the end is quite clear :) -Video is here: https://youtu.be/ZLTyX4zL2Fc +Original Video is here: https://youtu.be/ZLTyX4zL2Fc