Haskell:
Генерация случайных чисел
Как:
Для генерации случайных чисел в Haskell обычно используется пакет random
, который является частью платформы Haskell. Вот пошаговое руководство:
Сначала убедитесь, что у вас установлен пакет random
. Если нет, вы можете получить его через Cabal или Stack.
Генерация случайного числа
Для генерации простого случайного числа вы можете использовать функцию randomRIO
, которая производит случайное значение в заданном диапазоне.
import System.Random (randomRIO)
main :: IO ()
main = do
randomNumber <- randomRIO (1, 10) :: IO Int
putStrLn $ "Случайное число: " ++ show randomNumber
Генерация списка случайных чисел
Генерация списка случайных чисел немного сложнее, но все же проста:
import System.Random (randomRIO)
randomList :: Int -> IO [Int]
randomList 0 = return []
randomList n = do
r <- randomRIO (1, 100)
rs <- randomList (n-1)
return (r:rs)
main :: IO ()
main = do
numbers <- randomList 5
print numbers
Этот фрагмент кода создает функцию randomList
, которая генерирует список случайных целых чисел. Замените (1, 100)
на желаемый диапазон.
Подробнее
Пакет random
Haskell предоставляет генератор псевдослучайных чисел (PRNG), что означает, что генерируемые числа не являются по-настоящему случайными, но могут казаться случайными для многих приложений. Основа возможности генерации случайных чисел в Haskell лежит в типе класса RandomGen
, который абстрагирует различные методы генерации случайных чисел, и в типе класса Random
, который включает типы, которые могут быть сгенерированы случайным образом.
Исторически подход Haskell к генерации случайных чисел акцентировался на чистоте и воспроизводимости. Именно поэтому операции, связанные со случайностью, явно обрабатываются в монаде IO
или требуют вручную передавать и обновлять состояния генератора — чтобы сохранить ссылочную прозрачность.
В некоторых приложениях, таких как криптография, псевдослучайные числа, генерируемые стандартным PRNG, могут быть недостаточно безопасными. Для этих случаев программисты Haskell часто обращаются к более специализированным библиотекам, таким как crypto-random
, которые разработаны для удовлетворения строгих требований криптографических приложений.
Более того, альтернативные библиотеки, такие как mwc-random
, предлагают лучшую производительность и качество случайных чисел для симуляций и других приложений за счет реализации современных алгоритмов, таких как Mersenne Twister.
Выбирая подход к генерации случайных чисел в Haskell, крайне важно учитывать потребности приложения в отношении качества случайности, производительности и безопасности, чтобы выбрать наиболее подходящий инструмент или библиотеку.