【问题标题】:How to generate a list which contains a given number of random numbers within a range in Haskell?如何在Haskell的范围内生成一个包含给定数量的随机数的列表?
【发布时间】:2012-02-26 17:16:58
【问题描述】:

我知道如何生成给定范围内的单个随机数、随机数列表、包含给定数量随机数的列表,但不知道如何生成包含范围内给定数量随机数的列表。谁能帮我解决这个问题?

这段代码(从 haskell.org 提取)生成一个包含 10 个随机数的列表,但我需要给出一个范围,关于如何编辑它以给出一个范围的任何想法?

import System.Random
import Data.List

main = do
 seed  <- newStdGen
 let rs = randomlist 10 seed
 print rs

randomlist :: Int -> StdGen -> [Int]
randomlist n = take n . unfoldr (Just . random)

【问题讨论】:

    标签: list haskell random


    【解决方案1】:
    randomList :: (Random a) => (a,a) -> Int -> StdGen -> [a]
    randomList bnds n = take n . randomRs bnds
    

    使用来自System.RandomrandomRs

    【讨论】:

    • 感谢您的回答,但此代码给出了错误:无法证明显式类型绑定中的约束 *** 表达式:randomList *** 类型:RandomGen a => (a,a) -> Int -> StdGen -> [a] *** 给定上下文:RandomGen a *** 约束:随机 a
    • @PraveenieNilakshikaPerera:约束是错误的。它应该是(Random a) =&gt; ... 而不是(RandomGen a) =&gt; ...
    • @PraveenieNilakshikaPerera:哎呀,已修复:s(这就是我从黑线鳕文档中快速复制用法但忘记种子也是基于类的:s)
    • @ivanm 你能告诉我如何调用这个函数吗?我认为它是“randomList (10, 100) 10 种子”,但它不起作用,对不起,我是菜鸟:/
    • 也可以使用randomR:randomList n = (take n .) . unfoldr . (Just .) . randomR
    【解决方案2】:

    quickcheck 也可用于生成随机数,并且实际上具有非常好的组合子,使得生成生成器更易于理解。
    要使用它,您只需要导入一个模块:

    import Test.QuickCheck
    

    然后可以将生成器定义为:

    t :: Int -> (Int,Int) -> Gen [Int]
    t n r = vectorOf n (choose r)
    

    要运行这个生成器,你可以使用sample':

    randomList n r = head `fmap` (sample' $ t n r)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-22
      • 1970-01-01
      • 2014-01-29
      • 2014-02-25
      • 2017-06-27
      • 2019-11-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多