Игнорирование деталей реализации генератора случайных чисел (что на практике требует побочных эффектов, а в теории нет необходимости), тогда эта функция не имеет побочных эффектов, но не является чистой.
По сути, представьте, что вызов функции - это машина оракула, которая возвращает случайные числа, полностью основанные на ничто. Где-то есть доказательство того, что вы не можете этого сделать, но пока только представьте, что это так.
Если вы рассматриваете функцию PRNG как эту машину оракула, которая выдает вам случайное число каждый раз, когда вы запрашиваете его, тогда оно не имеет побочных эффектов и является нечистым, и функция наследует его.
Тип побочного эффекта, который не нарушает ссылочную прозрачность, иногда называют «мягким побочным эффектом», поскольку он не изменяет поведение программы (примечание: прежде чем вы скажете мне, что чтение времени меняет В зависимости от поведения сгенерированного числа спецификация вызова функции говорит о том, что функция возвращает случайное число. Чтение часов является подробностью реализации того, как заставить эту спецификацию работать. Изменение часов (за исключением крайне вырожденных обстоятельств) не меняет тот факт, что функция возвращает псевдо-случайное число, поскольку в спецификации не указано, что это за число.
Классическим примером мягкого побочного эффекта является регистрация, поскольку программы обычно не проверяют свои журналы и не изменяют поведение на его основе.
Если вы хотите сделать это функционально чистым способом, вам придется реализовать монаду состояния.
http://fsharpcode.blogspot.com/2008/12/f-state-monad-type-state-state-state-of.html
В общем, возьмите это, сделайте так, чтобы вы указали генератор случайных чисел и 'a int, и тогда ваш поток управления изолирует примесь от одной функции и создаст жесткий порядок для секвенирования.
На самом деле нет смысла делать это в F #, поскольку наличие нечистых функций на самом деле не вызывает проблем (с другой стороны, наличие функций с побочными эффектами).
Конечно, эта монада нечиста, но она хорошо изолирует нечистоту.