2016-03-20 14 views
0

私は、迅速かつGameplaykitで乱数生成を学習していました。次のコードでは、randomDistを初期化するときに生成される数値を示します。nextIntを呼び出すと、すでに生成された数値からサンプルを取得するか、nextInt()を呼び出すと乱数生成器が生成されますか?GameplayKitによる乱数生成

let rand = GKMersenneTwisterRandomSource()   // the generator can be specified 
let randomDist = GKRandomDistribution(randomSource: rand, lowestValue: 50, highestValue: 100) 
randomDist.nextInt() 

答えて

2

GKRandomDistributionは、任意の根底にあるランダマイザーを利用できることを覚えておいてください - GameplayKit GKRandomSourceクラスのつまりだけでなく、任意の、しかしGKRandomプロトコルを実装するクラス。だから自分のランダムなソースを実装し、そのメソッドがどのように呼び出されるかを見ることで、自分自身でこの質問に答えることができます。

class LoggingRandomSource: GKRandom { 
    let source = GKARC4RandomSource() 
    @objc func nextInt() -> Int { 
     let num = source.nextInt() 
     print("nextInt: \(num)") 
     return num 
    } 
    @objc func nextIntWithUpperBound(upperBound: Int) -> Int { 
     let num = source.nextIntWithUpperBound(upperBound) 
     print("nextIntWithUpperBound: \(num)") 
     return num 
    } 
    @objc func nextUniform() -> Float { 
     let num = source.nextUniform() 
     print("nextUniform: \(num)") 
     return num 
    } 
    @objc func nextBool() -> Bool { 
     let flip = source.nextBool() 
     print("nextBool: \(flip)") 
     return flip 
    } 
} 

let rand = LoggingRandomSource() 
let randomDist = GKRandomDistribution(randomSource: rand, lowestValue: 50, highestValue: 100) 
randomDist.nextInt() 

あなたはランダム分布のクラスについてのいくつかのことに気づくでしょう、このトリックを模索してください:その方法の一つに呼び出しごとに一度根本的なランダムソースに

  • GKRandomDistribution通話nextIntWithUpperBoundを。元のソースのnextIntWithUpperBoundが均一であると仮定されているので、これは理にかなっています。GKRandomDistributionは、その均一なintをそのlowestValue - highestValueの範囲にマップするだけです。

  • GKGaussianDistributionは、そのメソッドの1つの呼び出しごとに、基礎となるnextUniformを2回呼び出します。これは、2つの均一なランダム値が与えられた場合にガウス(正規の)ランダム値を生成する方法がたくさんあるためです。Box-Muller transformを参照してください。

  • GKShuffledDistributionは、最初に番号を求めるときにnextIntWithUpperBoundを呼び出しますが、元のソースを再度呼び出すことなく、さらに多くのことを求めることができます。これは、そのディストリビューションの文書化された振る舞いに適合します。同じ範囲を再度繰り返す前に、範囲内のすべての値を使い果たしてしまいます。 1つの簡単な方法は、それらの値をすべて取り、順序をシャッフルし、空になるまでシャッフルされたプールから各コールの値を引き出すことです。