Here I'm going to show some creative and fun ways of generating random numbers without using random package in python.
When we call time() function of the package time, it returns floating point number - current time in seconds since the Epoch:
>>> time.time()
3392849227.6848479We are interested in fractional-part, which is displaying milliseconds, and changing so fast. We need the rightmost part. So, here is the function:
import time
def gen_number() -> int:
return int(str(time.time())[-2])You may ask why we are using -2 instead of -1 for string indexing. We cannot get 0 if we use -1 as index, because trailing zeros are truncated in the floating part.
Let's test our gen_number function which generates numbers from 0 to 9 randomly:
results = [0 for i in range(10)]
for _ in range(10**5):
results[gen_number()] += 1
print(results)Output:
[10007, 10033, 12136, 9972, 9528, 9360, 9017, 10051, 6658, 13238]Here we can see that the distribution is quite good.
Here is the another example using time package, which generates True and False (or 1 and 0) randomly:
import time
def gen_tf() -> bool:
return time.time() == time.time()False is increased. Whereas, in high-end computers, we almost don't get False results.
Lets test the gen_tf function:
results = {True: 0, False: 0}
for _ in range(10**5):
results[gen_tf()] += 1
print(results)The results will be different. For example if we run this code on online python interpreters like Python.org, Programiz, or Onlinegdb, we get result like:
{True: 55577, False: 44423}
{True: 50281, False: 49719}The distribution is nearly equal. But when you run this on the high-end computers, results will look like (in my case):
{True: 99990, False: 10}To increase the chances of getting False we can use datetime.now().timestamp() instead of time.time():
from datetime import datetime
def gen_tf() -> bool:
return datetime.now().timestamp() == datetime.now().timestamp()Because dateime.now().timestamp() has two function calls, it executes slower, so the probabilies of getting False are increased