您可以生成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
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
来实现:或者,您可以简单地生成三个随机数字:
您可以使用类似
replicateM :: Applicative m => Int -> m a -> m [a]
的内容来分解重复,例如,如果您想将数字位数作为参数: