我正在尝试制作一个小型的Haskell游戏,该游戏会生成3位数的随机数,然后用户尝试通过x次尝试来猜测它,我的问题是,我知道如何在haskell中生成随机数,但是我不知道如何使该随机数具有特定长度,例如,仅生成比3个数字组成的随机数,例如334,554,998,342或348。 有什么提示或起点吗? 会很感激的。
答案 0 :(得分:1)
您可以只生成100–999范围内的随机数,例如使用randomR :: (RandomGen g, Random a) => (a, a) -> g -> (a, g)
和显式生成器,或使用randomRIO :: Random a => (a, a) -> IO a
使用全局生成器。
如果要允许使用带有零前缀的数字(例如001
),则可以生成0-999范围内的数字,然后,如果需要提取各个数字以进行比较,则可以使用div
和mod
:
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