import torch
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
# Retina display
%config InlineBackend.figure_format = 'retina'
import warnings
warnings.filterwarnings('ignore')
import arviz as az
from tueplots import bundles
plt.rcParams.update(bundles.beamer_moml())


# Also add despine to the bundle using rcParams
plt.rcParams['axes.spines.right'] = False
plt.rcParams['axes.spines.top'] = False

# Increase font size to match Beamer template
plt.rcParams['font.size'] = 16
# Make background transparent
plt.rcParams['figure.facecolor'] = 'none'
class SimplePRNG:
    def __init__(self, seed=0):
        self.seed = seed
        self.a = 1664525
        self.c = 1013904223
        self.m = 2**32

    def random(self):
        self.seed = (self.a * self.seed + self.c) % self.m
        return self.seed / self.m

    def generate_N_random_numbers(self, N):
        random_numbers = []
        for _ in range(N):
            random_numbers.append(self.random())
        return random_numbers

# Usage
prng = SimplePRNG(seed=42)  # You can change the seed value
N = 10000  # Change N to the number of random numbers you want to generate
random_numbers = prng.generate_N_random_numbers(N)
_ = plt.hist(random_numbers, bins=10)

az.plot_kde(np.array(random_numbers), rug=False)
<AxesSubplot:>

_ = plt.hist(np.random.rand(10000), bins=10)

az.plot_kde(np.random.rand(10000), rug=False)
<AxesSubplot:>

### Uniform (a, b)

a = -2
b = 2

random_numbers_a_b = a + (b - a) * np.array(random_numbers)
plt.hist(random_numbers_a_b, bins=10)
(array([1006., 1012.,  963.,  964., 1008.,  939., 1039., 1012., 1031.,
        1026.]),
 array([-1.99864224e+00, -1.59883546e+00, -1.19902869e+00, -7.99221917e-01,
        -3.99415144e-01,  3.91628593e-04,  4.00198402e-01,  8.00005174e-01,
         1.19981195e+00,  1.59961872e+00,  1.99942549e+00]),
 <BarContainer object of 10 artists>)