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 randomHatEndNum 10    // 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;
}
 

Function Library

Share