// static_rand_range_test.cpp : Defines the entry point for the console application.
//

#pragma once

#include "targetver.h"

#include <stdio.h>
#include <cstdlib>
#include <tchar.h>

int Rand_count;

#define	SEMIRAND_MAX_LOG	4
#define	SEMIRAND_MAX		(2 << SEMIRAND_MAX_LOG)	//	Do not change this!  Change SEMIRAND_MAX_LOG!

int Semirand_inited = 0;
int Semirand[SEMIRAND_MAX];

int myrand()
{
	int rval;
	rval = rand();
	Rand_count++;
//	nprintf(("Alan","RAND: %d\n", rval));
	return rval;
}

//	Initialize Semirand array.
void init_semirand()
{
	int	i;

	Semirand_inited = 1;

	for (i=0; i<SEMIRAND_MAX; i++)
		Semirand[i] = (myrand() << 15) + myrand();
}

int static_rand(int num)
{
	int	a, b, c;

	if (!Semirand_inited)
		init_semirand();

	a = num & (SEMIRAND_MAX - 1);
	b = (num >> SEMIRAND_MAX_LOG) & (SEMIRAND_MAX - 1);
	c = (num >> (2 * SEMIRAND_MAX_LOG)) & (SEMIRAND_MAX - 1);

	return Semirand[a] ^ Semirand[b] ^ Semirand[c];
}

// Note: min and max are inclusive
int static_rand_range(int num, int min, int max)
{
	int	rval = static_rand(num);
	rval = (rval % (max - min + 1)) + min;
	return rval;
}

int main(int argc, char* argv[])
{
	int min = 1;
	int max = 3;
	FILE *file;
	file = fopen("file.txt","w+");
	for (int i = INT_MIN; i < INT_MAX; i++)
	{
		int result = static_rand_range(i, min, max);
		if (result < min || result > max)
		{
			printf("ANOMALY: Seed=%d, Min=%d, Max=%d, Output=%d\n", i, min, max, result);
			fprintf(file, "ANOMALY: Seed=%d, Min=%d, Max=%d, Output=%d\n", i, min, max, result);
		}
		if (i % 10000000 == 0)
		{
			printf("Seed @ %d\n", i);
			fprintf(file, "Seed @ %d\n", i);
		}
	}
	fclose(file); /*done!*/
	return 0;
}


