Ignore my first example - it's actually unnescessarily complicated. Chosing the second example only...

Pic Powers Up and executes this code...

RandomSeed var WORD
LightSelector var BYTE

Read 0,RandomSeed.Lowbyte
RandomSeed.Lowbyte=RandomSeed.Lowbyte+23
' best with any ODD number here
Write 0,RandomSeed.Lowbyte

(The starting value in EEPROM at location zero is irrelevant. It can itself be Zero).

At this point we have a WORD value of 'something' (which is different each time the PIC powers up)... we now use this to seed the Random sequence for this evenings light show...

Loop:
RANDOM RandomSeed

Now, we've got a 16-bit random value... but we're only interested really in the bottom 4 bits...

LightSelector=RandomSeed & $000F

Lightselector now contains a value between 0 and 15 which is used to select the next light to sequence...

Gosub BlinkyLight

This now Blinks our Light for whatever length of time, then...

Goto Loop

we loop around for the next Random light to be selected.

Tomorrow, you will notice we start with a new Random value in EEPROM to which we add our constant and store. Therefore tomorrows Random sequence will be seeded with a DIFFERENT start value, so the entire light show will be different. Ad nauseum each night forever (or until EEPROM location zero wears out)... but since the EEPROM is only written to ONCE each evening, we've got 270 years of evenings to play with...

This pretty much is the core of your ENTIRE program just handed to you - there is no more, this is it in it's entire complexity. Just add your I/O and your Config Fuses and you're done.