psuedo-random delay
Hi Larry, I saw your earlier post in another forum, but wasn't sure if you had access to micros or not. The circuit you have in mind could be done with analog or digital electronics. A digital approach is a little complicated for discrete MSI chips, but would fit well into a small micro or CPLD (~32 cell density). Here's what I'd do:
Emulate a fairly long maximal length linear-feedback shift register (LFSR) in memory or registers. In hardware, it's basically just a shift register with an XOR gate providing feedback from appropriately placed taps. The following app. note lists all the taps for LFSR counters of length n=3 to 168.
https://www.xilinx.com/bvdocs/appnotes/xapp210.pdf
You can emulate an LFSR in code with shifts and xors (you also need to shift across byte boundries with an 8-bit PIC). Choose a counter length of around 16 - 32 bits to get a balance between a fast code loop and a large enough count granularity (the 0.5 - 90 seconds is divided by the counter size (2^n) to get the output count resolution). The loop should execute relatively fast compared to the button response time, around a few hundred Hz or better. Start shifting when the button is pressed & debounced, stop when it's released.
Then code a down-counter using the number in the LFSR (you can use the same registers or memory locations) and stop at zero. Start with a fixed output delay of 0.5 seconds, and add a delay to each iteration of the down-counter loop. Choose the loop delay so that the maximum starting count value of 2^n results in a 90 second output delay.
Notes to speed up the LFSR loop: registers are generally faster than memory (may not apply to your PIC, it's true for some micro architectures), if you have some available to hold the count. Also, pick an LFSR length that only needs two taps, like n=17 or 31, to eliminate extra "xor" instructions from the code.
I'm sure there are many other ways to do this, it's the first thing that came to mind. Good luck!
(I'll post an analog alternative once I've had some time to try it out first)