//for leds
byte led[5]={8,9,10,11,12};
void initLedPins(){
for(int i=0;i<5;i++){
pinMode(led[i],OUTPUT);
}
}
//random
#define MIN_UNIQUES 3 //must be at least one lower then sum of numbers betwhen NUMSTART and NUMEND
#define NUMSTART 1 //random start number, include the given number
#define NUMEND 5 //random end number, include the given number
int rndVal;
int counter = 0;
int r_last[MIN_UNIQUES];
int retrys = 0;
void setup() {
Serial.begin(115200);
initLedPins();
//to create near real random numbers use randomSeed.
//reboot more times to see it in serialmonitor
Serial.print("without seed every boot comes the same number: ");
Serial.println(random(0, 4096));
randomSeed(analogRead(0)); //one call per session is ok. use unconnected analogpin
Serial.print("with seed ever an another number: ");
Serial.println(random(0, 4096));
delay(3000);
}
void loop() {
int randNum = myRandom(NUMSTART,NUMEND); //get Random number...
digitalWrite(led[randNum-1],HIGH); //...set led...
Serial.print("Number "); //...print infos
if (randNum < 10) Serial.print(" ");
Serial.print(randNum);
Serial.print(" - ");
if (retrys < 10) Serial.print(" ");
Serial.print(retrys);
Serial.print(" Retrys ");
for (int i = 0; i < retrys; i++) {
Serial.print("#");
}
Serial.println();
delay(200); //hmmmm.THAT seems how the worst command that we know! i want nothing to say to that!
digitalWrite(led[randNum-1],LOW); //led off
}
int myRandom(int nums, int nume) {
int r = random(nums, nume); //give first try
retrys = 0;
for (int i = 0; i < MIN_UNIQUES; i++) { //compare number with all numbers in array to check if try unique
if (r == r_last[i]) {
r = random(nums, nume+1); //if not, retry...
i = -1; //...from start...
retrys++; //...and count trys... only to show in serialmonitor.
}
}
counter++; //count for last-numbers array
if (counter == MIN_UNIQUES) { //if array end reached, back to array start
counter = 0;
}
r_last[counter] = r; //save last unique number
return r; //send number
}