Rand Number Gen That Won't Repeat In Row

I am currently working on a code that I put together to randomly switch between colors on an RGB led. So far it is pretty basic. I am trying to figure out how to set up the "random number generator" so that it will not generate the same number twice in a row (thereby holding a color for longer than the 500ms delay time).

Any help with this would be much appreciated.

// Here is my code

int randNumber;
int redLED = 13;
int grnLED = 12;
int bluLED = 8;

void setup()
{
Serial.begin(9600);
pinMode(redLED, OUTPUT);
pinMode(grnLED, OUTPUT);
pinMode(bluLED, OUTPUT);

}

void loop()
{
// print random number from 0 to 5
randNumber = random(6);
Serial.println(randNumber);

// Red
if(randNumber == 0){
digitalWrite(redLED, HIGH);
digitalWrite(grnLED, LOW);
digitalWrite(bluLED, LOW);
}

// Green
if(randNumber == 1){
digitalWrite(redLED, LOW);
digitalWrite(grnLED, HIGH);
digitalWrite(bluLED, LOW);
}

//Blue
if(randNumber == 2){
digitalWrite(redLED, LOW);
digitalWrite(grnLED, LOW);
digitalWrite(bluLED, HIGH);
}

// Yellow
if(randNumber == 3){
digitalWrite(redLED, HIGH);
digitalWrite(grnLED, HIGH);
digitalWrite(bluLED, LOW);
}

// Magenta
if(randNumber == 4){
digitalWrite(redLED, HIGH);
digitalWrite(grnLED, LOW);
digitalWrite(bluLED, HIGH);
}

// White
if(randNumber == 5){
digitalWrite(redLED, HIGH);
digitalWrite(grnLED, HIGH);
digitalWrite(bluLED, HIGH);
}

// time, in ms, between randomly generated numbers
delay(500);

}

Generate your new value and loop while it is the same as the last?

int randNumber;
int newRand;
// same declarations
void setup()
{
 // same setup stuff plus
 randNumber = random(6);
}

void loop()
{
 Serial.println(randNumber);

  //switch randNumber etc 

 do {
   newRand = random (6);
 } while (newRand == randNumber);
 randNumber = newRand;
 
 // time, in ms, between randomly generated numbers
 delay(500);
 
}

Please post using the [#] button in the post editor :slight_smile:

I hacked on your code for a bit: [NOT TESTED!]

// Here is my code

const byte MAX_RAND  = 6;

const byte RED    = 0;
const byte GREEN  = 1;
const byte BLUE    = 2;
const byte YELLOW  = 3;
const byte MAGENTA  = 4;
const byte WHITE  = 5;

byte color;
byte previousColor = MAX_RAND; //select a safe number

byte redLED = 13;
byte grnLED = 12;
byte bluLED = 8;


void setup()
{
  Serial.begin(9600);
  pinMode(redLED, OUTPUT);
  pinMode(grnLED, OUTPUT);
  pinMode(bluLED, OUTPUT);
}

void loop()
{
  selectColor();
  showColor();
  // time, in ms, between randomly generated numbers
  delay(500);
}


void selectColor() 
{
  //assure that we never draw the same number
  do {
    color = random(MAX_RAND);
  } while (color == previousColor);
  //save the currently selected color so we do draw it again
  previousColor = color;
  
  //DEBUG print random number from 0 to MAX_RAND
  Serial.println(color);
}

void showColor() {
  switch (color) {
    case RED:
      digitalWrite(redLED, HIGH);
      digitalWrite(grnLED, LOW);
      digitalWrite(bluLED, LOW);
      break;
    case GREEN:
      digitalWrite(redLED, LOW);
      digitalWrite(grnLED, HIGH);
      digitalWrite(bluLED, LOW);
      break;
    case BLUE:
      digitalWrite(redLED, LOW);
      digitalWrite(grnLED, LOW);
      digitalWrite(bluLED, HIGH);
      break;
    case YELLOW:
      digitalWrite(redLED, HIGH);
      digitalWrite(grnLED, HIGH);
      digitalWrite(bluLED, LOW);
      break;
    case MAGENTA:
      digitalWrite(redLED, HIGH);
      digitalWrite(grnLED, LOW);
      digitalWrite(bluLED, HIGH);
      break;
    case WHITE:
      digitalWrite(redLED, HIGH);
      digitalWrite(grnLED, HIGH);
      digitalWrite(bluLED, HIGH);
      break;
    default://an error ocurred! check selectColor() 
      digitalWrite(redLED, LOW);
      digitalWrite(grnLED, LOW);
      digitalWrite(bluLED, LOW);
  }
}

New elements:
const http://arduino.cc/en/Reference/Const
byte http://arduino.cc/en/Reference/Byte
switch() case: http://arduino.cc/en/Reference/SwitchCase
functions http://www.arduino.cc/en/Reference/FunctionDeclaration

:slight_smile: Have fun!

You could attempt to read an unconnected analog input pin, and use its fluctuations to build up a bit-string to represent the number you want...

Thanks AlphaBeta. I knew that there was a way to store the most recently selected color and then base the next selection on that to avoid getting two of the same color in a row, however my coding abilities are still weak and it was giving me some trouble.

I appreciate your help.