2012-02-04 5 views
4

私は与えられた範囲内の単一の乱数、乱数のリスト、乱数の数を含むリストを生成する方法を知っていますが、RANGE内の乱数を含むリストはありません。誰かが私にこれを助けることができますか?Haskellで範囲内の任意の数の乱数を含むリストを生成するには?

このコード(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) 

答えて

11
randomList :: (Random a) => (a,a) -> Int -> StdGen -> [a] 
randomList bnds n = take n . randomRs bnds 

System.RandomからrandomRsを使用します。

+0

答えをいただきありがとうございますが、このコードでは次のようなエラーが表示されます: 明示的にtyp (a、a) - > Int - > StdGen - > [a] ***式:randomList ***タイプ:RandomGen a =>(a、a) - > Int - > StdGen - > [a] ***与えられたコンテキスト:RandomGen a ***制約:ランダムa – n00b

+0

@PraveenieNilakshikaPerera:制約が間違っています。 '(RandomGen a)=> ...'の代わりに '(Random a)=> ...'でなければなりません。 – hammar

+0

@PraveenieNilakshikaPerera:whoops、fixed:s(これは、haddockドキュメントの使用状況を素早くコピーして、シードがクラスベースであることを忘れるために得られるものです): – ivanm

5

quickcheckは、乱数を生成するために使用することもでき、実際にはジェネレータを作成することをより理解しやすくする優れた結合子を持っています。あなたはsample'を利用することができ、このジェネレータを実行するには

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

:ジェネレータを定義

import Test.QuickCheck 

が続いて行うことができます。

あなただけの1つのモジュールをインポートする必要があり、それを使用するには
randomList n r = head `fmap` (sample' $ t n r) 
関連する問題