begintemplate RandomStream
	public r, repick, start, rseed, seq	// Define variables and funcs that are
									//  accessible from outside the class
									//  object
									
	objref r						// Define a new object
	
	proc init() {					// Define an init proc that runs whenever
									//  a new member of the RandomStream
									//  class is instantiated
									
		startseed = $1				// Arg 1 specifies where in this
									//  cell's randomstream to start
		
		rseed = $2					// Arg 2 specifies which randomstream
									//  to use (based on the gid of the cell)
									
		r = new Random()			// Set the object r to a Random object
		
		start()						// Run the 'start' func (defined below)
									//  on this newly created RandomStream
	}
	func start() {					// Define a 'start' func for this class

		return r.MCellRan4(startseed, rseed)
									// The function returns with a random
									//  number obtained using the MCellRan4
									//  algorithm, with the seed based on
									//  the gid of this cell as the
									//  starting point for the low index.
									//  The high index will start after
									//  a section reserved for cell noise 
	}
	func repick() {					// Define a 'repick' func for this class
	
		return r.repick()			// Subsequent random numbers are picked
									//  from this random number stream
	}
	
	func seq() {
		return r.seq()
	}
endtemplate RandomStream