Sono un po 'sorpreso da una frase trovata nel libro "Programmazione Clojure" (1 ° [e solo come scrivo questa !?] edizione), pagina 78:
It should be obvious that it's impossible to deterministically test a function that depends upon a random number generator
Beh, per me non è affatto ovvio.
Per prima cosa nel contesto il libro parla sicuramente di un PRNG (quella frase segue solo una menzione di java.util.Random , che è un PRNG), non una vera fonte casuale.
Visto che i linguaggi funzionali che supportano la funzione di ordine superiore possono essere, beh, trasmessi funzioni ... Perché non passare semplicemente la funzione generatore casuale stessa alla funzione che vuoi essere in grado di testare in modo deterministico?
Se ho qualcosa di simile alla seguente funzione (è solo un esempio) e il PRNG stesso è deterministico, perché sarebbe impossibile testare in modo deterministico la seguente funzione:
(defn shuffle-deck [deck last-generated-number prngf]
...)
Mi rendo conto che invece di mantenere un riferimento (globale?) al tuo generatore casuale, devi mantenere un riferimento all'ultimo numero generato (e aggiornarlo di conseguenza) ma questo è fondamentalmente.
Puoi quindi testare / riprodurre il comportamento di qualsiasi funzione utilizzando un PRNG, purché tu passi il PRNG e "il numero casuale al quale sei attualmente".
Non è diverso dai motori di gioco deterministici (come Blizzard's Warcraft III) in cui i replay contengono solo gli input del giocatore, l'ora in cui sono avvenuti e il seme generale al PRNG.
Fondamentalmente sono un po 'confuso: ho sempre visto PRNG come qualcosa che non è "casualità" e ho l'impressione che i linguaggi funzionali che accettano la funzione di ordine superiore lo rendano particolarmente facile per riprodurre il comportamento delle funzioni in base al PRNG.
Quindi, quella frase del libro (che ho trovato un grande libro tra due) completa la spazzatura? Io certo non lo trovo "ovvio" affatto ...