random blinking without delay and blinking with delay in 1

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