function simulate( N, expected, p, stat, nobs, niter ) {
	var pool;
	var opts;
	var freq;
	var cnt;
	var v;
	var i;

	pool = incrspace( 0, N, 1 ); // TODO: replace with strided interface
	opts = {
		'size': nobs,
		'probs': p
	};
	freq = new Float64Array( N );
	cnt = 1;
	for ( i = 0; i < niter; i++ ) {
		v = sample( pool, opts ); // TODO: use `sample.factory` method once sample pkg is updated
		freq = tabulate( N, v, 1, freq, 1 );
		if ( testStatistic( N, freq, 1, expected, 1 ) >= stat ) { // TODO: consider replacing with low-level double-precision strided interface
			cnt += 1;
		}
		if ( i < niter-1 ) {
			dfill( N, 0.0, freq, 1 );
		}
	}
	return cnt / ( niter+1 );
}
Performs a Monte-Carlo simulation.

@private
@param {NonNegativeInteger} N - number of indexed elements
@param {Float64Array} expected - expected number of observations
@param {NumericArray} p - probabilities
@param {number} stat - test statistic
@param {NonNegativeInteger} nobs - total number of observations
@param {NonNegativeInteger} niter - number of iterations
@returns {number} p-value