Generador de números aleatorios funcionales puros - mónada estatal

El libro 'Programación Funcional en Scala'muestra un ejemplo de generador de números aleatorios funcionales puros como se muestra a continuación

trait RNG {
    def nextInt: (Int, RNG)
}

object RNG {
    def simple(seed: Long): RNG = new RNG {
        def nextInt = {
            val seed2 = (seed*0x5DEECE66DL + 0xBL) &
                        ((1L << 48) - 1)
            ((seed2 >>> 16).asInstanceOf[Int],
             simple(seed2))
        }
    }
}

El uso se verá así

val (randomNumber,nextState) = rng.nextInt

Entiendo que es una función pura, ya que devuelve elsiguiente estado y lo deja en el cliente API para usarlo para llamarnextInt la próxima vez necesitaría un número aleatorio, pero lo que no entendí es "¿Cómo se generará el primer número aleatorio? como debemos proporcionarseed al menos una vez.

¿Debería haber otra función para levantarseed conseguir unRNG? Y si es así, ¿cómo esperamos que el cliente de esta API lo sepa (porque en la implementación no funcional el usuario solo llamanextInt y el estado es mantenido por API)

¿Alguien puede dar un ejemplo completo de generador de números aleatorios funcionales puros en Scala y quizás relacionarlo con Monad en general?

Respuestas a la pregunta(4)

Su respuesta a la pregunta