#include "apl.h"
#include <stdlib.h>
#include <limits.h>


#ifdef QDOS
static int rseed=1039;

/* -- osrand - return a random number between 0 and n-1 */
int osrand(n)
int	n;
{
	long k1;

	/* -- make sure we don't get stuck at zero */
	if ( rseed == 0L ) rseed = 1L;

	/* -- algorithm taken from Dr Dobbs Journal, Nov. 1985, page 91 */
	k1 = rseed / 127773L;
	if ( ( rseed = 16807L * (rseed - k1 * 127773L) -k1 * 2836L) < 0L )
		rseed += 2147483647L;

	/* -- return a random number between 0 and n-1 */
	return( (int) (rseed & (long) n ) );
}

random()
{ return osrand(INT_MAX)/2;}

#endif  /* QDOS */


ex_deal()
{
	struct item *p;
	int m, n;
	double f;
	data d1, d2;

	m = topfix();
	n = topfix();
	if(m < 0 || m > n) error("deal D");
	p = newdat(DA, 1, m);
	datum = thread.iorg;
	for(; n!=0; n--) {
		f = m;
		f /= n;
		if(random()/(float)INT_MAX < f) {
			putdat(p, datum);
			m--;
		}
		datum += one;
	}
	m = p->size;
	while(m > 0) {
		f = random()/(float)INT_MAX;
		n = m * f;
		m--;
		if(n != m) {
			p->index = n;
			d1 = getdat(p);
			p->index = m;
			d2 = getdat(p);
			p->index = n;
			putdat(p, d2);
			p->index = m;
			putdat(p, d1);
		}
	}
	*sp++ = p;
}

data
ex_rand(d)
data d;
{
	double f;

	f = (random()/(float)INT_MAX) * d;
	d = floor(f) + thread.iorg;
	return(d);
}
