1
0
mirror of https://github.com/TACIXAT/XorShift128Plus synced 2025-05-13 17:44:05 +00:00
XorShift128Plus/xs128p.py
2025-04-21 14:36:35 -05:00

93 lines
2.9 KiB
Python

import math
from z3 import *
from ChromeRandomnessPredictor import ChromeRandomnessPredictor
from FirefoxAndSafariRandomnessPredictor import FirefoxAndSafariRandomnessPredictor
# Print 'last seen' random number
# and winning numbers following that.
# This was for debugging. We know that Math.random()
# is called in the browser zero times (updated) for each page click
# in Chrome and once for each page click in Firefox.
# Since we have to click once to enter the numbers
# and once for Play, we indicate the winning numbers
# with an arrow.
def power_ball(browser, generated, skip=4):
# for each random number (skip 4 of 5 that we generated)
for idx in range(len(generated[skip:])):
# powerball range is 1 to 69
poss = list(range(1, 70))
# base index 4 to skip
gen = generated[skip + idx :]
# get 'last seen' number
g0 = gen[0]
gen = gen[1:]
# make sure we have enough numbers
if len(gen) < 6:
break
print(g0)
# generate 5 winning numbers
nums = []
for jdx in range(5):
index = int(gen[jdx] * len(poss))
val = poss[index]
poss = poss[:index] + poss[index + 1 :]
nums.append(val)
# print indicator
if idx == 0 and browser == "chrome":
print("--->", end="")
elif idx == 2 and browser == "firefox":
print("--->", end="")
else:
print(" ", end="")
# print winning numbers
print(sorted(nums), end="")
# generate / print power number or w/e it's called
double = gen[skip + 1]
val = int(math.floor(double * 26) + 1)
print(val)
def main():
browser = "chrome" # | 'safari' | 'firefox'
print("BROWSER: %s" % browser)
# In your browser's JavaScript console:
# - For Chrome/Firefox : `Array.from({ length: 5 }, Math.random);`
# - For Safari : `JSON.stringify(Array.from({ length: 5 }, Math.random), null, 2);`
# Enter at least the 5 first random numbers you observed here:
# Observations show all browsers need ~5
sequence = [
0.5368584449767335,
0.883588766746984,
0.7895949638905317,
0.5106241305628436,
0.49965622623126693,
]
print(sequence)
# Add original created random numbers to generated (copy the list)
generated = sequence[:]
RANDOM_NUMBERS_TO_GENERATE = 10
if browser == "chrome":
predictor = ChromeRandomnessPredictor(sequence)
elif browser == "firefox" or browser == "safari":
predictor = FirefoxAndSafariRandomnessPredictor(sequence)
else:
raise Exception(f"unknown browser {browser}")
for _ in range(RANDOM_NUMBERS_TO_GENERATE):
next = predictor.predict_next()
generated.append(next)
# use generated numbers to predict powerball numbers
power_ball(browser=browser, generated=generated, skip=len(sequence))
main()