Pure funktionaler Zufallszahlengenerator - Statusmonade

Das Buch 'Funktionale Programmierung in Scala 'zeigt ein Beispiel für einen reinen funktionalen Zufallszahlengenerator wie folgt

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))
        }
    }
}

Die Verwendung wird wie folgt aussehen:

val (randomNumber,nextState) = rng.nextInt

Ich bekomme den Teil, dass es eine reine Funktion ist, da es das @ zurückginext state und überlässt es dem API-Client, um es zum Aufrufen von @ zu verwendenextInt das nächste Mal würde es eine Zufallszahl brauchen, aber was ich nicht verstanden habe, ist 'ie wird die erste Zufallszahl generier wie wir @ zur Verfügung stellen müssseed zumindest einmal

Sollte es eine andere Funktion zum Heben gebenseed um ein @ zu bekommRNG? Und wenn ja, wie erwarten wir dann, dass der Client dieser API davon erfährt (da der Benutzer in der nicht funktionalen Implementierung nur @ aufruftnextInt und der Zustand wird von der API gepflegt)

Kann jemand ein vollständiges Beispiel für einen reinen funktionalen Zufallszahlengenerator in Scala geben und ihn vielleicht allgemein mit dem Staat Monad in Verbindung bringen.