The random() function of the AVR is pretty useful, however, since it is based on a seed, it will always deliver the same random numbers if the seed is the same. On a computer, one generally overcomes this problem by setting the seed using a pseudo-random process such as the computer clock.
Since there is no internal clock on an AVR, a good solution is to use an open analog pin. The following code does exactly this, but instead of just calling
randomSeed( analogRead(pin) );
it calls analogRead() four times to fill up all of the 32 bits of the seed. Here it is:
/// Initializes the random number generator /// by using analogRead on an open pin. void seed(byte pin) { unsigned long seed = 0; for (int s=0; s<32; s+=10) { unsigned long val = 0; do { val = analogRead(pin); } while (val == 0); // discard zeros seed |= (val << s); } randomSeed( seed ); }