2016-05-13 2 views
2

ハスケルのSystem.RandomがHaskell For A Greatを学習したI/Oの章を読んだ後の理解を明確にしたいと思います。HaskellのStdGen型の文字列表現の意味

私が理解するところでは、タイプStdGenの値は、ランダムシーケンスの生成シードのように振る舞います。つまり、StdGenタイプは、タグ付きの(しかしランダムな)整数の一種に過ぎず、タグはStdGenです。これは正しいです?

また、getStdGenは、開始シードのためにオペレーティングシステム(またはおそらく?)をクエリし、そのアクションの実行結果はgenに格納されます。

タイプStdGenの値を印刷しようとすると、次のように、常に2つの大きな整数が空白で区切られています。私はこの値が単一の整数であると想像していたでしょう。それで、ホワイトスペースは何を意味するのでしょうか?私が理解から

Prelude System.Random> gen <- getStdGen 
Prelude System.Random> 
Prelude System.Random> gen 
751404879 1655838864 
Prelude System.Random> 

答えて

5

StdGenは、2つのシード値を使用する擬似乱数ジェネレータです。

StdGenの著者は、従来の形式を使用する代わりに、2つのシード値をスペースで区切って表示するだけで、Showインスタンスを実装することにしました。

stdNextの正確なアルゴリズムはSystem.Randomです。

5

、タイプStdGenの値がランダム配列の生成種子のように振る舞います。

これは正しいです。 StdGen型タグがStdGenであるとタグ付けされた種類しか(ランダムな)整数ではない意味する

これはありません。 PRNGの内部状態が完全に非構造的な数であると考える先験的な理由はありません。異なるアルゴリズムは、異なる内部データ構造を使用します。 StdGenの場合には、あなたはread the sourceでき:

data StdGen 
= StdGen !Int32 !Int32 

この特定のアルゴリズムの場合、内部状態は2つの32ビット数です。他のアルゴリズムはmore complicated data structuresを使用します。 (?多分または他の何か)

またgetStdGenは、オペレーティング・システムを照会開始シード

のための概念上のプログラムの起動時にmkStdRNG 0に初期化される種を含むグローバルIORefがあります。詳細hereを見ることができます。

StdGenタイプの値を印刷しようとすると、以下のように、常に2つの大きな整数が空白で区切られています。それで、ホワイトスペースは何を意味するのでしょうか?

StdGenに含まれる2つのInt32値を分離します。