diff --git a/graph.py b/graph.py
new file mode 100644
index 0000000000000000000000000000000000000000..d905f4d27509558da50e0d564d193a4317fa7ffb
--- /dev/null
+++ b/graph.py
@@ -0,0 +1,95 @@
+from simulator_v2 import *
+import numpy as np
+from scipy.stats import norm
+import pandas as pd
+import matplotlib.pyplot as plt
+
+
+# --- CONST ---
+
+arrival_rate = 10                   # average arrival rate of 2 visitors per time unit
+service_rate = 1                    # average service rate of 1 visitor per time unit
+num_visitors = 100                  # total number of visitors to simulate
+num_queues = 3                      # total number of queues
+
+generation_number = 10000           # number of generation
+
+queue_policy = ['random', 'round-robin', 'shortest-queue']      # queue selection policy
+
+# --- PROCESS ---
+
+lsit_averages_by_policy = {}
+
+for p in queue_policy:
+    lsit_averages_by_policy[p] = []
+    
+    for i in range(generation_number):
+
+        simulator = PoissonQueueSimulator(arrival_rate, service_rate, num_visitors, num_queues, p)
+        visitors, max_queue_lengths, average_waiting_times = simulator.simulate()
+
+        average_queue_waiting_times = 0
+        for avg in average_waiting_times:
+            average_queue_waiting_times += avg
+
+        average_queue_waiting_times /= len(average_waiting_times)
+        lsit_averages_by_policy[p].append(average_queue_waiting_times)
+
+
+
+# --- CMD ---
+
+# print(f"Visitor ID\tArrival Time\t\tStart Time\t\tEnd Time\t\tProcess Time\t\tWaiting Time\t\tQueue ID")
+# for visitor in visitors:
+#     print(f"{visitor['visitor_id']}\t\t{visitor['arrival_time']}\t"
+#         f"{visitor['start_time']}\t{visitor['end_time']}\t"
+#         f"{visitor['process_time']}\t{visitor['total_time']}\t"
+#         f"{visitor['queue_id']}")
+
+# print()
+
+# for queue_id, max_length in enumerate(max_queue_lengths):
+#     print(f"Queue ID: {queue_id}, Max Queue Length: {max_length}, Average Waiting Time: {average_waiting_times[queue_id]}")
+
+# print("\n")
+
+
+# --- PLOT ---
+
+# fig, ax = plt.subplots()
+
+# g_id = range(len(list_averages))
+
+# ax.hist(g_id, list_averages)
+
+# ax.set_ylabel('Average waiting time')
+# ax.set_title(f"Waiting time per generation on {generation_number}")
+# ax.legend(title='average waiting time')
+
+# plt.show()
+
+fig, ax = plt.subplots(3)
+num_bins = 100
+
+# mu, std = norm.fit(list_averages)
+i = 0
+for p in queue_policy:
+    counts, bins = np.histogram(lsit_averages_by_policy[p], np.linspace(min(lsit_averages_by_policy[p]), max(lsit_averages_by_policy[p]), num_bins))
+
+    ax[i].hist(lsit_averages_by_policy[p], bins[:-1], alpha=0.75,
+            weights=(1 / sum(counts)) * np.ones_like(lsit_averages_by_policy[p]),
+            label="Height's distribution")
+    
+    ax[i].set(xlabel=p, ylabel='percentage')
+    i += 1
+
+plt.xlabel("Averages waiting time")
+plt.ylabel("Percentage")
+
+# xmin, xmax = plt.xlim()
+# x = np.linspace(xmin, xmax, 100)
+# p = norm.pdf(x, mu, std)
+# plt.plot(x, p, 'k', linewidth=2, color='r')
+
+
+plt.show()  
\ No newline at end of file
diff --git a/simulator_v2.py b/simulator_v2.py
index 4279b41c4db5475b1ef18fc235923d726b58d02b..3460529ac3c53c15858a236159de61cecb1053c9 100644
--- a/simulator_v2.py
+++ b/simulator_v2.py
@@ -11,14 +11,11 @@ class PoissonQueueSimulator:
         self.num_queues = num_queues
         self.queue_policy = queue_policy
         self._round_robin_count = 0
-        self.visitor_queue = [[] for _ in range(
-            self.num_queues)]  # (end time, total time)
+        self.visitor_queue = [[] for _ in range(self.num_queues)] # (end time, total time)
 
     def simulate(self):
-        arrival_times = np.random.exponential(
-            scale=1 / self.arrival_rate, size=self.num_visitors)
-        process_times = np.random.exponential(
-            scale=1 / self.service_rate, size=self.num_visitors)
+        arrival_times = np.random.exponential(scale = 1 / self.arrival_rate, size = self.num_visitors)
+        process_times = np.random.exponential(scale = 1 / self.service_rate, size = self.num_visitors)
         max_queue_lengths = [0] * self.num_queues
         total_waiting_times = [0] * self.num_queues
         num_visitors_in_queue = [0] * self.num_queues
@@ -89,53 +86,21 @@ class PoissonQueueSimulator:
             elif len(self.visitor_queue[queue_id]) == minNbInQueue:
                 minQueues.append(queue_id)
         return minQueues[np.random.randint(0, len(minQueues))]
-
-
-def _run():
-    simulator = PoissonQueueSimulator(
-        arrival_rate, service_rate, num_visitors, num_queues, queue_policy)
+        
+def _run(arrival_rate, service_rate, num_visitors, num_queues, queue_policy):
+    simulator = PoissonQueueSimulator(arrival_rate, service_rate, num_visitors, num_queues, queue_policy)
     visitors, max_queue_lengths, average_waiting_times = simulator.simulate()
-
-    ################ WRITING TO CSV ##################
-    with open(f"{policy}.csv", "w", newline="") as csvfile:
-        fieldnames = [
-            "Visitor ID", "Arrival Time", "Start Time", "End Time", "Process Time", "Total Time", "Queue ID"]
-        writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
-
-        writer.writeheader()
-
-        for visitor in visitors:
-            writer.writerow(
-                {"Visitor ID": visitor["visitor_id"], "Arrival Time": visitor["arrival_time"], "Start Time": visitor["start_time"],
-                 "End Time": visitor["end_time"], "Process Time": visitor["process_time"], "Total Time": visitor["total_time"], "Queue ID": visitor["queue_id"]})
-    ################ WRITING TO CSV ##################
-
-    print("Visitors:")
-    print(f"Visitor ID;Arrival Time;Start Time;End Time;Process Time;Total Time;Queue ID")
+    
+    print(f"Visitor ID\tArrival Time\t\tStart Time\t\tEnd Time\t\tProcess Time\t\tWaiting Time\t\tQueue ID")
     for visitor in visitors:
-        print(f"{visitor['visitor_id']};{visitor['arrival_time']};"
-              f"{visitor['start_time']};{visitor['end_time']};"
-              f"{visitor['process_time']};{visitor['total_time']};"
-              f"{visitor['queue_id']}")
-    print("\nQueue Stats:")
-    for queue_id, max_length in enumerate(max_queue_lengths):
-        print(
-            f"Queue ID: {queue_id}, Max Queue Length: {max_length}, Average Waiting Time: {average_waiting_times[queue_id]}")
+        print(f"{visitor['visitor_id']}\t\t{visitor['arrival_time']}\t"
+            f"{visitor['start_time']}\t{visitor['end_time']}\t"
+            f"{visitor['process_time']}\t{visitor['total_time']}\t"
+            f"{visitor['queue_id']}")
 
+    print()
 
-# Example usage
-seed = int(time.time())
-np.random.seed(seed)
-arrival_rate = 10  # average arrival rate of n visitors per time unit
-service_rate = 1  # average service rate of n visitors per time unit
-num_visitors = 10  # total number of visitors to simulate
-num_queues = 3  # total number of queues
-# queue selection policy: random, round-robin, shortest-queue
-# queue_policy = 'shortest-queue'
-policies = ["random", "round-robin", "shortest-queue"]
-
-for policy in policies:
-    queue_policy = policy
+    for queue_id, max_length in enumerate(max_queue_lengths):
+        print(f"Queue ID: {queue_id}, Max Queue Length: {max_length}, Average Waiting Time: {average_waiting_times[queue_id]}")
 
-    # for i in range(100):
-    _run()
+    print("\n")