如何生成随机数的特定数字?

时间:2018-12-09 22:12:41

标签: haskell

我正在尝试制作一个小型的Haskell游戏,该游戏会生成3位数的随机数,然后用户尝试通过x次尝试来猜测它,我的问题是,我知道如何在haskell中生成随机数,但是我不知道如何使该随机数具有特定长度,例如,仅生成比3个数字组成的随机数,例如334,554,998,342或348。 有什么提示或起点吗? 会很感激的。

1 个答案:

答案 0 :(得分:1)

您可以只生成100–999范围内的随机数,例如使用randomR :: (RandomGen g, Random a) => (a, a) -> g -> (a, g)和显式生成器,或使用randomRIO :: Random a => (a, a) -> IO a使用全局生成器。

如果要允许使用带有零前缀的数字(例如001),则可以生成0-999范围内的数字,然后,如果需要提取各个数字以进行比较,则可以使用divmod

do
  number <- randomRIO (0, 999)
  let
    hundreds = number `div` 100
    tens = (number `div` 10) `mod` 10
    ones = number `mod` 10
  …

或者,您可以简单地生成三个随机数字:

import System.Random (randomRIO)

f = do
  d1 <- randomDigit
  d2 <- randomDigit
  d3 <- randomDigit
  let number = 100 * d1 + 10 * d2 + d3
  …
  where
    randomDigit = randomRIO (0, 9)

例如,如果您想将位数作为参数,则可以使用replicateM :: Applicative m => Int -> m a -> m [a]之类的方法来排除重复:

import Control.Monad (replicateM)
import System.Random (randomRIO)

f n = do
  ds <- replicateM n randomDigit
  let number = digitsToInt ds
  …
  where
    randomDigit = randomRIO (0, 9)
    digitsToInt = foldl ((+) . (10 *)) 0