En general, para generar números "aleatorios" en el hardware (para fines de entretenimiento), puede hacer algo como tomar un mecanismo que es algo impredecible y combinarlo con un mecanismo predecible, pero no obvio.
Por ejemplo, si tiene un contador que se está ejecutando rápidamente y muestrea la salida cada vez que el usuario presiona un botón (como durante la reproducción de la secuencia anterior) que será un tanto aleatorio, ya que pueden tomar varias cantidades de tiempo. Pero alguien que juegue con el sistema presionando los botones muy rápidamente puede tender a obtener los mismos valores una y otra vez (aunque si el reloj está en el rango de MHz, puede que no sea una preocupación real).
Por el contrario, puede utilizar un Registro de desplazamiento de retroalimentación lineal (Wikipedia) que alimenta una función combinatoria del estado actual a Cambie el registro de nuevo a su entrada, para generar una secuencia que no sea tan obvia para los humanos, aunque su salida para las mismas entradas sea en realidad completamente predecible. Utilizado por sí mismo, esto tampoco sería una buena idea, ya que daría las mismas secuencias a cada juego del juego y sería rápidamente memorizado por un usuario que repite.
Pero, si combina dos métodos, como usar el temporizador para obtener un valor de inicio impredecible, y luego usar el registro de desplazamiento de retroalimentación lineal para mezclarlo (o tal vez dejar que el LFSR se ejecute libremente contra un reloj rápido y muestrear) basado en la interacción del usuario) deberías poder obtener algo lo suficientemente aleatorio para un juego de entretenimiento.
Otra fuente que podría probar serían los bits de orden inferior de un convertidor de analógico a digital.
Lo que sea que haga, probablemente querrá simularlo (y también el diseño de su sistema en general) antes de construir el circuito. El proyecto es lo suficientemente complejo como para que valga la pena usar un FPGA pequeño o un CPLD más grande.
Y, finalmente, tenga en cuenta que históricamente, el juego original de Simon aparentemente usó un microprocesador temprano, el TMS1000. Por lo general, las operaciones secuenciales complejas se pueden implementar de manera más eficiente, con máquinas de estado elegidas solo para problemas que son simples, que deben ejecutarse extremadamente rápido o que están aprendiendo sustitutos para el trabajo eventual en tales problemas.
Editar:
enlace
Contiene algunas observaciones interesantes, que incluyen un cambio eventual del TMS1000 a lo que puede ser una versión etiquetada personalizada del mismo. Más relevante para su pregunta, sugiere que el original generó sus números aleatorios al muestrear un contador de ejecución libre cuando el usuario presionó un botón ;-)