view history edit print login register

randomHat

A random function that chooses every number from a "hat" before repeating

/* 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
#define randomHatEndNum 10
#define NumberInHat abs(randomHatEndNum - randomHatStartNum) + 1

int i, x;

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

void loop()
{        // randomHat test
  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;		//as long as they can be changed without harming other code
  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