function factory( N, K, n ) {
	if (
		isnan( N ) ||
		isnan( K ) ||
		isnan( n ) ||
		!isNonNegativeInteger( N ) ||
		!isNonNegativeInteger( K ) ||
		!isNonNegativeInteger( n ) ||
		N === PINF ||
		K === PINF ||
		K > N ||
		n > N
	) {
		return constantFunction( NaN );
	}
	return cdf;

	/**
	* Evaluates the cumulative distribution function (CDF) for a hypergeometric distribution.
	*
	* @private
	* @param {number} x - input value
	* @returns {Probability} evaluated CDF
	*
	* @example
	* var y = cdf( 2.0 );
	* // returns <number>
	*/
	function cdf( x ) {
		var denom;
		var probs;
		var num;
		var ret;
		var i;

		if ( isnan( x ) ) {
			return NaN;
		}
		x = trunc( x );
		if ( x < max( 0, n + K - N ) ) {
			return 0.0;
		}
		if ( x >= min( n, K ) ) {
			return 1.0;
		}

		probs = new Float64Array( x+1 );
		probs[ x ] = pmf( x, N, K, n );

		/*
		* Use recurrence relation:
		*
		*   (x+1)( N - K - (n-x-1) )P(X=x+1)=(K-x)(n-x)P(X=x)
		*/
		for ( i = x-1; i >= 0; i-- ) {
			num = ( i+1 ) * ( N-K-(n-i-1) );
			denom = ( K-i ) * ( n-i );
			probs[ i ] = ( num/denom ) * probs[ i+1 ];
		}
		ret = sum( probs );
		return min( ret, 1.0 );
	}
}
Returns a function for evaluating the cumulative distribution function (CDF) for a hypergeometric distribution with population size `N`, subpopulation size `K`, and number of draws `n`.

@param {NonNegativeInteger} N - population size
@param {NonNegativeInteger} K - subpopulation size
@param {NonNegativeInteger} n - number of draws
@returns {Function} CDF

@example
var mycdf = factory( 30, 20, 5 );
var y = mycdf( 4.0 );
// returns ~0.891

y = mycdf( 1.0 );
// returns ~0.031