This is a simple Python implementation. Note the global variables p and a should in general be re-generated each pass. p is any prime and a is the primitive root of p.

import random
 
# Public information
p = 157 # Prime
a = 5   # Primitive root
 
class Agent():
    def __init__(self, name):
        self.name = name
        self.GenerateN()
 
    def GenerateN(self):
        self.N = random.randint(1, 1000)
        return self.N
 
    def ComputeM(self):
        M = (a ** self.N) % p
        print self.name, "computes M to be", M
        return M
 
    def ComputeK(self, M):
        K = (M ** self.N) % p
        print self.name, "computes K to be", K
        return K
 
Bob = Agent("Bob")
Alice = Agent("Alice")
for i in range(10):
    print "Run", i
 
    MA = Alice.ComputeM()
    MB = Bob.ComputeM()
 
    KA = Alice.ComputeK(MB)
    KB = Bob.ComputeK(MA)
    if KA != KB:
        print "RESULT: Error computing key on run", i
    else:
        print "RESULT: Key exchange complete, generated key was", KA
    Bob.GenerateN()
    Alice.GenerateN()
    print