首页 文章

如何生成随机数量的具体数字?

提问于
浏览
0

我正在尝试制作一个小的haskell游戏,生成3位数的随机数,然后用户尝试在x次尝试中猜测它,我的问题是,我知道如何在haskell中生成随机数,但我不知道如何使该随机数具有特定长度,例如,仅产生随机数,而不是由3个数字组成,如334,554,998,342或348.任何提示或起点?会有太多的贬义 .

1 回答

  • 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
    

相关问题