La tua domanda non è chiara in quanto non specifichi se stai parlando di numeri casuali veri o di numeri pseudo-casuali, quindi risponderò a entrambi.
Numeri casuali veri
Hai ragione che i programmi funzionali non possono produrre numeri casuali veri. Ma nessuno dei due può programmi imperativi. I computer sono ancora macchine deterministiche, indipendentemente dal fatto che stiano eseguendo un programma C o un programma Haskell.
Numeri Pseudo-Casuali
I numeri Pseudo-Casuali sono generati da un generatore di numeri pseudo-casuali (alias PRNG). I PRNG sono solo algoritmi come qualsiasi altro algoritmo. Possono essere espressi in un linguaggio funzionale così come possono essere espressi in un linguaggio imperativo.
Quindi, non c'è davvero alcuna differenza tra i linguaggi funzionali e le lingue imperative quando si tratta di numeri casuali. Entrambi possono calcolare numeri pseudo-casuali e nessuno può calcolare numeri casuali veri (dato che non possono essere calcolati affatto).
in functional programming "true" randomness cannot be achieved since in FP functions are pure/idempotent and return the same value irrespective of number of invocations without any side effects.
Ancora una volta, la stessa cosa è vera per la programmazione imperativa. Se chiami srand
con lo stesso numero seme, determinerai sempre la stessa sequenza numerica pseudo-casuale da rand
, ogni volta.
L'unico modo per ottenere la casualità vera è tramite I / O. Ma i linguaggi funzionali possono modellare l'I / O bene, sia con un Monade I / O (o qualcosa di più specializzato come Random
monad), tipi lineari, tipi di mondo, tipi di effetti, un sistema di effetti o come Scala , ML, Clojure e F♯ lo fanno, semplicemente permettendoli e confidando che il programmatore non commetta errori.
Quindi, in altre parole, non ha senso chiedere dei numeri casuali specificamente . Un PRNG è solo una funzione, quindi se ti stai chiedendo in che modo la programmazione funzionale può essere usata per trattare numeri pseudo-casuali, allora dovresti chiedere come la programmazione funzionale può essere usata per gestire le funzioni, perché non c'è niente di speciale su un PRNG, è solo una funzione. E True Randomness è solo I / O, quindi, di nuovo, non ha senso chiedergli specificatamente .
Se accetti di poter scrivere funzioni in FP, devi anche accettare che puoi scrivere PRNG in FP. E se accetti di poter leggere l'orologio, leggere l'input dell'utente, leggere un file, accedere a un database, accedere al web, ecc., Allora devi anche accettare di poter leggere i numeri casuali veri. (In effetti, su Unix, ad esempio, i driver di dispositivo sono generalmente esposti come file e un dispositivo a numeri casuali verrebbe tipicamente esposto come un file letto. E c'è un servizio Web che serve numeri casuali veri.)