Skip to content

@wandrson /TrueRandomSeed.ino
Last active

Embed URL


Subversion checkout URL

You can clone with
Download ZIP
This is a simple straightforward and relatively lightweight example of how to seed the internal PRNG function with a truly random value
// TrueRandomSeed.ino
// This example sketch shows how to provide a truly random seed value to the built in
// library pseudo random number generator. This ensures that your sketch will be
// using a different sequence of random numbers every time it runs. Unlike the
// usually suggested randomSeed(analogRead(0)) this method will provide a much more
// uniform and varied seed value. For more information about the basic technique used
// here to produce a random number or if you need more than one such number you can
// find a library, Entropy from the following web site along with documentation of how
// the library has been tested to provide TRUE random numbers on a variety of AVR
// chips and arduino environments.
// timer-jitter-entropy-sources/entropy-library
// Copyright 2014 by Walter Anderson, wandrson01 at gmail dot com
#include <avr/interrupt.h>
#include <avr/wdt.h>
#include <util/atomic.h>
// The following addresses a problem in version 1.0.5 and earlier of the Arduino IDE
// that prevents randomSeed from working properly.
#define randomSeed(s) srandom(s)
volatile uint32_t seed; // These two variables can be reused in your program after the
volatile int8_t nrot; // function CreateTrulyRandomSeed()executes in the setup()
// function.
void CreateTrulyRandomSeed()
seed = 0;
nrot = 32; // Must be at least 4, but more increased the uniformity of the produced
// seeds entropy.
// The following five lines of code turn on the watch dog timer interrupt to create
// the seed value
MCUSR = 0;
while (nrot > 0); // wait here until seed is created
// The following five lines turn off the watch dog timer interrupt
MCUSR = 0;
seed = seed << 8;
seed = seed ^ TCNT1L;
void setup()
// The preceeding two function calls will take approximately 0.5 second to execute if
// nrot is set to 32 ... the rest of your setup code should FOLLOW from here.
void loop()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Something went wrong with that request. Please try again.