function Random( prng, idtypes, odtypes, policies, options ) {
	var opts;
	if ( !( this instanceof Random ) ) {
		if ( arguments.length < 5 ) {
			return new Random( prng, idtypes, odtypes, policies );
		}
		return new Random( prng, idtypes, odtypes, policies, options );
	}
	if ( !isFunction( prng ) ) {
		throw new TypeError( format( 'invalid argument. First argument must be a function. Value: `%s`.', prng ) );
	}
	if (
		!isCollection( idtypes ) ||
		idtypes.length < 1 ||
		!everyBy( idtypes, isDataType )
	) {
		throw new TypeError( format( 'invalid argument. Second argument must be an array of data types. Value: `%s`.', idtypes ) );
	}
	if (
		!isCollection( odtypes ) ||
		odtypes.length < 1 ||
		!everyBy( odtypes, isDataType )
	) {
		throw new TypeError( format( 'invalid argument. Third argument must be an array of data types. Value: `%s`.', odtypes ) );
	}
	if ( !isObject( policies ) ) {
		throw new TypeError( format( 'invalid argument. Fourth argument must be an object. Value: `%s`.', policies ) );
	}
	if ( !isOutputDataTypePolicy( policies.output ) ) {
		throw new TypeError( format( 'invalid argument. Fourth argument must be an object having a supported output data type policy. Value: `%s`.', policies.output ) );
	}
	opts = {
		'order': defaults.get( 'order' )
	};
	if ( arguments.length > 4 ) {
		if ( !isPlainObject( options ) ) {
			throw new TypeError( format( 'invalid argument. Options argument must be an object. Value: `%s`.', options ) );
		}
		if ( hasOwnProp( options, 'order' ) ) {
			opts.order = options.order;
			if ( !isOrder( opts.order ) ) {
				throw new TypeError( format( 'invalid option. `%s` option must be a valid memory layout. Option: `%s`.', 'order', opts.order ) );
			}
		}
	}
	this._prng = prng;
	this._idtypes = idtypes;
	this._odtypes = odtypes;
	this._policies = {
		'output': policies.output
	};
	this._opts = opts;
	return this;
}
Constructor for creating ndarrays filled with pseudorandom values drawn from a unary PRNG.

@constructor
@param {Function} prng - unary pseudorandom value generator
@param {StringArray} idtypes - list of supported input data types
@param {StringArray} odtypes - list of supported output data types
@param {Object} policies - policies
@param {string} policies.output - output data type policy
@param {Object} [options] - function options
@param {string} [options.order] - default memory layout
@throws {TypeError} first argument must be a function
@throws {TypeError} second argument must be an array of supported data types
@throws {TypeError} third argument must be an array of supported data types
@throws {TypeError} fourth argument must be an object having supported policies
@throws {TypeError} options argument must be an object
@throws {TypeError} must provide valid options
@returns {Random} instance

@example
var dtypes = require( '@stdlib/ndarray/dtypes' );
var exponential = require( '@stdlib/random/base/exponential' );

var idt = dtypes( 'real_and_generic' );
var odt = dtypes( 'real_floating_point_and_generic' );

var policies = {
    'output': 'real_floating_point_and_generic'
};
var options = {
    'order': 'row-major'
};

var rand = new Random( exponential, idt, odt, policies, options );

var v = rand.generate( [ 2, 2 ], 2.0 );
// returns <ndarray>

@example
var dtypes = require( '@stdlib/ndarray/dtypes' );
var ndzeros = require( '@stdlib/ndarray/zeros' );
var exponential = require( '@stdlib/random/base/exponential' );

var idt = dtypes( 'real_and_generic' );
var odt = dtypes( 'real_floating_point_and_generic' );

var policies = {
    'output': 'real_floating_point_and_generic'
};
var options = {
    'order': 'row-major'
};

var rand = new Random( exponential, idt, odt, policies, options );

var out = ndzeros( [ 2, 2 ] );
var v = rand.assign( 2.0, out );
// returns <ndarray>

var bool = ( v === out );
// returns true