## RandomHat

/* RandomHat

``` Paul Badger 2007
choose one from a hat of n choices each time through loop
Choose each number exactly once before reseting and choosing again
*/
```

```#define randomHatStartNum 0   // add your own values here

#define NumberInHat abs(randomHatEndNum - randomHatStartNum) + 1  // don't change this

int i, x;

void setup()
{
Serial.begin(9600);
Serial.println("start ");
}

void loop()
{	  // this just tests the randomHat function
for (i=1; i<=NumberInHat; i++){
x = randomHat();
Serial.print(x);
Serial.print(" ");
delay(100);
}
Serial.println(" ");
}

int randomHat(){
static int  totalNumInHat = abs(randomHatEndNum - randomHatStartNum) + 1;
static int currentNumInHat = 0;
abs(randomHatEndNum - randomHatStartNum) + 1;
static int randArray[abs(randomHatEndNum - randomHatStartNum) + 1];
int i;		// counter variable
int thePick;		//this is the return variable with the random number from the pool
int theIndex;

if  (currentNumInHat == 0){			    // hat is emply - all have been choosen - fill up array again
for (i = 0 ; i<=(totalNumInHat - 1); i++){  // Put 1 TO numberInHat in array - starting at address 0.
if (randomHatStartNum < randomHatEndNum){
randArray[i] = randomHatStartNum + i; }
else if (randomHatStartNum > randomHatEndNum){  // defensive programming in case startNum is greater than endNum
randArray[i] = randomHatEndNum + i; }
else{
return randomHatStartNum; }		   // startNum and endNum must be same number - return one - and bail out
}
currentNumInHat = abs(randomHatEndNum - randomHatStartNum) + 1;   // reset current Number in Hat
//if something should happen when the hat is empty do it here
}

theIndex = random(currentNumInHat);			 //choose a random index
thePick = randArray[theIndex];

for (i = theIndex; i<= (currentNumInHat - 1); i++){
randArray[i] =  randArray[i + 1];				   // bump all the higher array contents down one,  erasing the last number chosen
}
currentNumInHat--;							// decrement counter
return thePick;
}

```