OK, you got it working, which is good. Now improve it
unsigned long currentMillis = millis();
unsigned long currentMillisblinkrandom = millis();
unsigned long currentMillisblink = millis();
Why have 3 variables holding the current time ?
copy the value of millis() into currentMillis at the start of loop() and use it wherever you need to do calculations based on the current value of millis()
unsigned long waitUntil = 0;
waitUntil += intervalblinkrandom;
What is this doing ?
if (led12State == LOW)
led12State = HIGH ;
else
led12State = LOW ;
// Write new state
digitalWrite (led12, led12State ) ;
can be replaced with
digitalWrite(led12, !digitalRead(led12));
led12timer = millis () ;
led11timer = millis () ;
Don't call millis() again, just set them to the value of currentMillis saved at the start of loop() (see above)
switch ( counter)
{
case 0:
case 2:
case 4:
digitalWrite( led3, HIGH);
break;
case 1:
case 3:
case 5:
digitalWrite( led3, LOW);
break;
}
Looks like a clumsy way of alternating between led3 being HIGH or LOW