我想在一个函数中生成2个随机的Int值,并在调用其他函数时使用它们。这些函数需要一个Int,所以我想在do块中获取随机值。谁能告诉我,我应该如何正确地做这件事?
simmulatedGen :: [[Bool]] -> [[Bool]] ->Int -> Double -> Int -> [[Bool]]
simmulatedGen seed minim _ _ 0 = minim
simmulatedGen seed minim dimensiuni t iteratii = do
{i <- getStdRandom $ randomRIO (0,dimensiuni - 1 :: Int)
;j <- getStdRandom $ randomRIO (0,31:: Int)}
let vecin = selectVecin i j seed
valoareVecin = deJong dimensiuni (bitGenToDoubleArray dimensiuni vecin)
valoareMinim = deJong dimensiuni (bitGenToDoubleArray dimensiuni minim)
percentage = getStdRandom $ randomIO :: Double in
if valoareVecin < valoareMinim then simmulatedGen seed vecin dimensiuni t (iteratii - 1) else if t > percentage then simmulatedGen seed vecin dimensiuni t (iteratii - 1) else
simmulatedGen seed minim dimensiuni t (iteratii - 1)
我无法理解你自己的逻辑,但你可以尝试使用类似这个例子。
import System.Random
example :: Int -> IO [[Bool]]
example n = do
x <- randomRIO (1,10)
if n < x then
return [[True]]
else
return [[False],[False]]
main :: IO ()
main = do
b1 <- example 5
b2 <- example 5
print (b1, b2)
上面,我们生成一个随机的 Int
命名 x
,并与输入比较 n
,根据比较的结果返回两个不同的列表。在 main
我们用相同的参数调用函数两次,但由于随机性,我们可以观察到不同的结果。
作为一个经验法则,使用 x <- f args
当 f
返回 IO something
(结果可以是随机的)和 let x = f args
当结果不在 IO
结果是确定性的)。这不是一个硬性的规则,但在大多数情况下,你会希望使用这个。