MonadRandom
を使用しようとしています。私はそれをrandomPref
の機能に入れましたが、それ以降はすべてが拾い読みされます!任意のヒントが評価されます。モナドランダムを使用するコードをリファクタリングする方法
module AgentGenerator where
import System.Random
import Data.Hashable
import Control.Monad.Random
import System.Environment
-- Generate agents and write to a file
-- 'fname' - output filename
-- 's' - number of agent sets
-- 'n' - number of agents in a set
-- 'x' - number of preferences per agent
generate fname s n x = do
writeFile fname $ show $ generateAgentSets s n x
-- Agent type: Name, List of preferences
data Agent = Agent String [Double] deriving Show
type AgentSet = [Agent]
-- Generate 's' sets of 'n' agents each, with 'x' preferences each
generateAgentSets:: Integer -> Integer -> Integer -> [AgentSet]
generateAgentSets s n x = [generateAgents n x | i <- [1..s] ]
-- Generate n agents with 'x' preferences each
generateAgents:: Integer -> Integer -> AgentSet
generateAgents n x = [createAgent (show i) x | i <- [1..n]]
-- Create agent 'name' with 'x' preferences
createAgent:: String -> Integer -> Agent
createAgent name x = Agent name prefs where
prefs = [ randomPref (i + hashed) | i <- [1..x] ] where
hashed = fromIntegral (hash name)
-- Generate single random value between [0, 1] based on the seed
-- TODO: Get rid of the seed thing and use MonadRandom instead
randomPref :: (RandomGen g) => Integer -> Rand g [Double]
randomPref seed = getRandomR (0.0, 1.0)
ありがとう、私の 'randomPref'はリストを返すべきではありません - 私はちょうどこの型シグニチャ' Rand g [Double] 'をどこかに見つけてそれを無意識に使用しました。 '' MonadRandom''を使わなかった '' seed''は古いコードのままです - 実際 '' randomPref''を除くすべては 'MonadRandom'を使わないコードです。悪い事を使う方法!混乱させて申し訳ありません。 – drozzy
コンソールから 'generate" out.txt "2 10 3 getStdGen'を使用しようとすると、' RandomGen(IO StdGen) 'エラーが発生します:-( – drozzy
getStdGenはモナドの値を返します。 'getStdGenは>> = 2 10 3' "out.txtを" を生成、または代替的に、あなたは2 10 3(newStdGen種)' "out.txtを" 生成する '使用することができる。差は、共有、' getStdGen'グローバルを返すことですランダムなジェネレータと 'newStdGen'はシード値に基づいて新しい乱数ジェネレータを作成します – shang