Consider the following code:

import random
from queue import Queue, PriorityQueue
import matplotlib.pyplot as plt


# ******************************************************************************
# Constants
# ******************************************************************************
#!/usr/bin/python3
class Simulator:
    def __init__(self, service, arrival, sim_time, max_buffer_size = float('inf')):
        self.service = 1/service  # SERVICE is the average service time; service rate = 1/SERVICE
        self.arrival = 1/arrival  # ARRIVAL is the average inter-arrival time; arrival rate = 1/ARRIVAL
        self.load= self.service / self.arrival  # This relationship holds for M/M/1
        self.max_buffer_size = max_buffer_size
        self.type1 = 1
        self.sim_time = sim_time
        self.arrivals=0
        self.users=0
        self.data = None
        self.MM1= None
        self.FES = None
        self.result = None
        self.time = None
        random.seed(42)

    class Measure:
        def __init__(self):
            self.arr = 0
            self.dep = 0
            self.ut = 0
            self.oldT = 0
            self.delay = 0
            self.drop = 0

    class Client:
        def __init__(self, type, arrival_time):
            self.type = type
            self.arrival_time = arrival_time

    class Server:
        def __init__(self):
            self.idle = True
            self.users = 0

    def Arrival(self, time, queue, server_obj):
        server_obj.users += 1

        self.data.arr += 1
        self.data.ut += server_obj.users * (time - self.data.oldT)
        self.data.oldT = time

        inter_arrival = random.expovariate(lambd=1.0 / self.arrival)
        self.FES.put((time + inter_arrival, "arrival"))

        client = self.Client(self.type1, time)

        if len(queue) < self.max_buffer_size:
            queue.append(client)
        else:
            self.data.drop += 1
            server_obj.users -= 1

        if server_obj.idle:
            server_obj.idle = False

            service_time = random.expovariate(1.0 / self.service)

            self.FES.put((time + service_time, "departure", server_obj))

    def Departure(self, time, queue, server_obj):
        self.data.dep += 1
        self.data.ut += server_obj.users * (time - self.data.oldT)
        self.data.oldT = time

        if len(queue) > 0:
            client = queue.pop(0)

            self.data.delay += (time - client.arrival_time)
            server_obj.users -= 1

            if server_obj.users > 0:
                service_time = random.expovariate(1.0 / self.service)
                self.FES.put((time + service_time, "departure", server_obj))
            else:
                server_obj.idle = True
        else:
            server_obj.idle = True

    def run(self):
        self.data = self.Measure()
        self.result = {}
        self.MM1 = []
        self.time = 0
        self.FES = PriorityQueue()
        self.Server1 = self.Server()
        self.Server2 = self.Server()
        self.Server3 = self.Server()
        self.Server4 = self.Server()
        self.servers = [self.Server1, self.Server2, self.Server3, self.Server4]
        self.last_assigned_server = -1
        self.FES.put((0, "arrival"))

        while self.time < self.sim_time:
            (self.time, self.event_type, *server_obj) = self.FES.get()

            if self.event_type == "arrival":
                self.last_assigned_server = (self.last_assigned_server + 1) % len(self.servers)
                selected_server = self.servers[self.last_assigned_server]
                self.Arrival(self.time, self.MM1, selected_server)
            elif self.event_type == "departure":
                self.Departure(self.time, self.MM1, server_obj[0])

        self.users = self.Server1.users + self.Server2.users + self.Server3.users + self.Server4.users

I want to modify the service time distribution (it is now exponential). Tell me how to modify the code to use the following distribution as the service time distribution:
1. Uniform Distribution
2. Normal distribution