Генерація випадкових чисел

Haskell:
Генерація випадкових чисел

Як це зробити:

Для генерації випадкових чисел в Haskell, зазвичай використовується пакет random, який є частиною Haskell Platform. Ось крок-за-кроком інструкція:

Спершу, переконайтеся, що у вас встановлений пакет 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, важливо взяти до уваги потреби застосунку щодо якості випадковості, продуктивності та безпеки, аби вибрати найбільш відповідний інструмент або бібліотеку.