diff --git a/Random/__pycache__/generators.cpython-311.pyc b/Random/__pycache__/generators.cpython-311.pyc
index e579af00a05d62910d89bae5f79fead178f00e0d..1c7c6f91a25c41bbce2b366bb6cebb89630411f5 100644
Binary files a/Random/__pycache__/generators.cpython-311.pyc and b/Random/__pycache__/generators.cpython-311.pyc differ
diff --git a/Random/__pycache__/graph.cpython-311.pyc b/Random/__pycache__/graph.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..f4b02a4711d5363d2de598766976864cde8cc605
Binary files /dev/null and b/Random/__pycache__/graph.cpython-311.pyc differ
diff --git a/Random/generators.py b/Random/generators.py
index bbd6b193f75ef276e23277792d55a055ab724714..378fb007f6b4471e12ea4cd6ff2ce6e54ba3f0e9 100644
--- a/Random/generators.py
+++ b/Random/generators.py
@@ -1,6 +1,6 @@
 ## Various Random Generators ##
 import random
-
+import numpy as np
 
 class RandomNumberGenerator:
     def __init__(self):
@@ -29,7 +29,7 @@ class RandomNumberGenerator:
         """
         return n normalized values
         """
-        return [self.random() for i in range(n)] / self.max
+        return np.divide(np.array([self.random() for i in range(n)]),self.max)
 
 
 class LCG(RandomNumberGenerator):
@@ -62,7 +62,7 @@ class ParkMiller(LCG):
     """
 
     def __init__(self):
-        super().__init__(16807, 0, 2147483647)
+        super().__init__(16807, 0, (2**31) - 1)
 
 
 class KnuthLewis(LCG):
@@ -71,7 +71,7 @@ class KnuthLewis(LCG):
     """
 
     def __init__(self):
-        super().__init__(1664525, 1013904223, 4294967296)
+        super().__init__(1664525, 1013904223, 2**32)
 
 
 class Marsaglia(LCG):
@@ -80,7 +80,7 @@ class Marsaglia(LCG):
     """
 
     def __init__(self):
-        super().__init__(69069, 0, 4294967296)
+        super().__init__(69069, 0, 2**32)
 
 
 class LavauxJenssens(LCG):
@@ -89,7 +89,7 @@ class LavauxJenssens(LCG):
     """
 
     def __init__(self):
-        super().__init__(31167285, 1, 281474976710656)
+        super().__init__(31167285, 1, 2**48)
 
 
 class Haynes(LCG):
@@ -98,7 +98,7 @@ class Haynes(LCG):
     """
 
     def __init__(self):
-        super().__init__(6364136223846793005, 1, 18446744073709552000)
+        super().__init__(6364136223846793005, 1, 2**64)
 
 
 class LaggedFibonnaci(RandomNumberGenerator):
@@ -157,6 +157,9 @@ class MersenneTwister(RandomNumberGenerator):
     def random(self):
         return self.randomNorm()
 
+    def batchRandomNormalized(self,n):
+        return np.array([self.random() for i in range(n)])
+
 
 class CNS(RandomNumberGenerator):
     """
diff --git a/Random/graph.py b/Random/graph.py
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..64974ff5dfe66ba6560fd7ec4fbb3b70589e2a20 100644
--- a/Random/graph.py
+++ b/Random/graph.py
@@ -0,0 +1,66 @@
+"""
+Module for graphing
+"""
+
+import matplotlib.pyplot as plt
+import numpy as np
+import seaborn as sns
+
+def hist_distributivity_graph(N,RESOLUTION,seed,data):
+    """
+    graphs histograms
+    see values function in main module
+    """
+    for name in data:
+        print("building "+str(name)+" histogram...")
+        xlabel= "Value"
+        ylabel="Count"
+        title_name= name +"\n N = "+str(N)+"\n seed = "+str(seed) 
+        graph=sns.displot(data[name], kde=True)
+        graph.set(title=title_name)
+        graph.set_axis_labels(xlabel,ylabel)
+        graph.savefig(name+'_hist.png', bbox_inches='tight')
+    return
+
+def ecdf_graph(N,RESOLUTION,seed,data):
+    """
+    graphs histograms
+    see values function in main module
+    """
+    plt.clf()
+    for name in data:
+        print("building "+str(name)+" ecdf...")
+        xlabel= "Value"
+        ylabel="Cumulative Probability"
+        title_name= name +"\n N = "+str(N)+"\n seed = "+str(seed) 
+        graph=sns.displot(data[name], kind="ecdf")
+        graph.set(title=title_name)
+        graph.set_axis_labels(xlabel,ylabel)
+        graph.savefig(name+'_ecdf.png', bbox_inches='tight')
+    return
+
+def compare(N, RESOLUTION, seed, data):
+    """
+    Create graphs superposing two, already generated,
+    distributivity
+    """
+    plt.clf()
+    BW = 0.337
+    name = "compare_"
+    for e in data:
+        name += e+"_"
+    
+    #subdata = {k : data[k] for k in names}  
+    print("graphing "+str(name)+"...")
+    
+    xlabel = "Value"
+    ylabel = "Density"
+    title_name="N = "+str(N)+"\n seed = "+str(seed)
+    if N == 0:
+        title_name = "seed = "+str(seed)
+    graph=sns.kdeplot(data,legend=True,bw_adjust=BW,common_norm=False)
+    graph.set(title=title_name)
+    plt.xlabel(xlabel)
+    plt.ylabel(ylabel)
+    plt.savefig(name+'.png', bbox_inches='tight')    
+    return
diff --git a/Random/main.py b/Random/main.py
index 4473b35ba3d99f953f0c9d6a996dc321db4289c1..936aeb7f254edbb3c22b33edb0d41218cc475bea 100755
--- a/Random/main.py
+++ b/Random/main.py
@@ -1,29 +1,23 @@
 from generators import *
+import graph
 from datetime import datetime
 import matplotlib.pyplot as plt
 import numpy as np
 import seaborn as sns
 
-if __name__=="__main__":
+#shut up stupid warnings from not "the-most-up-to-date" libraries
+import warnings
+warnings.simplefilter(action='ignore', category=FutureWarning)
 
-    ##INIT PARAMS##
-    N = 1000000
-    RESOLUTION = 100
-    #set seaborn params
-    sns.set_theme(style="darkgrid")
-    
-    #bandwidth for smooth density
-    #https://en.wikipedia.org/wiki/Kernel_density_estimation#Bandwidth_selection
-    BW = 0.337
-    
-    #init generators
-    generators = [ParkMiller(), KnuthLewis(), Marsaglia()
-                  , LavauxJenssens(), Haynes(), MitchelMoore()
-                  , MersenneTwister(), BlumBlumShub()]
-    
-    #init seed on timesystem 
-    seed = datetime.now().timestamp()
-    
+def subdict(keys,dictio):
+    return {k : dictio[k] for k in keys} 
+
+def values(N, seed, generators):
+    """
+    random values N elements and given seed.
+    Returns a dictionnary with values
+    """ 
+    results = {}  
     #generate each diagrams for each random func
     for e in generators:
         name = type(e).__name__
@@ -31,14 +25,48 @@ if __name__=="__main__":
         print("processing "+name+"...")
         e.seed(seed)
         res = e.batchRandomNormalized(N)
-        results.append(results)
+        results[name] = res
+    return results
+
+def iteratives(N, seed, generator):
+    """
+    Random values iteratively with same seed and list N
+    """ 
+    results = {}  
+    #generate each diagrams for each random func
+    for n in N:
+        name = type(generator).__name__+"_"+str(n)
         
-        print("building histograms..") 
-        fig, ax = plt.subplots()
-        sns.displot(res, kde=True)
-        ax.set_xlabel('Value')
-        ax.set_ylabel('Probability density')
-        ax.set_title(type(e).__name__)
-        plt.savefig(type(e).__name__+'.png')
+        print("processing "+name+"...")
+        generator.seed(seed)
+        res = generator.batchRandomNormalized(n)
+        results[name] = res
+    return results
 
-    #generate diagrams with all randoms
+if __name__=="__main__":
+    ##INIT PARAMS##
+    N = 100
+    RESOLUTION = 1000
+    
+    #init generators
+    generators = [ParkMiller(), KnuthLewis(), Marsaglia()
+                  , LavauxJenssens(), Haynes(), MitchelMoore()
+                  , MersenneTwister(), BlumBlumShub()]
+    
+    #init seed on timesystem 
+    seed = int(datetime.now().timestamp())
+    
+    #set seaborn params
+    sns.set_theme(style="darkgrid")
+     
+    #generate all diagrams
+    data = values(N,seed,generators)
+    
+    #graph.hist_distributivity_graph(N,RESOLUTION,seed,data)
+    #graph.compare(N, RESOLUTION, seed
+    #           , subdict(["ParkMiller","KnuthLewis","Haynes"], data))
+    
+    #graph.ecdf_graph(N,RESOLUTION,seed,data)
+    
+    graph.compare(0, RESOLUTION, seed
+                  , iteratives([1000, 100000, 100000000], seed, ParkMiller()))