2017-02-08 5 views
0

Swift 3.0で乱数を生成する際に奇妙な問題が発生しています[この場合はCGPoints]。非常に単純なパーティクルフィルタを作成しようとしていますが、最初に以下のコードを使用してパーティクルをランダムにランダム化することに問題があります。Swift 3.0の配列内の各要素の乱数生成をどのように強制しますか?

私が「パーティクル」のセットを反復すると、一意のランダムなポイントが生成されますが、各パーティクルはまったく同じ一意のランダムポイント[BAD]を取得します。各パーティクルがユニークなランダムポイントを得るために間違っていることを私は確信していません

どのように私は各パーティクルにユニークなランダムポイントを取得させることができますか?

おかげ

スタン

問題の機能。 OK

func randomize(
    theListOfParticles: [RegionParticle] 
    ) -> [RegionParticle] { 

    var returnListOfParticles = [SRLSystemRegionParticle]() 

    for particle in theListOfParticles { 
     particle.position = self.randomPointInRegion() 
     returnListOfParticles.append(particle) 

    } 
    return returnListOfParticles 
} 

ヘルパー機能

/** 
Get a random point in the region. 
- Returns: CGPoint 
*/ 
func randomPointInRegion() -> CGPoint { 
    let x : CGFloat = Math.randomCGFloat(
     min: -(self.rect?.size.width)!, 
     max: (self.rect?.size.width)! 
    ) 
    let y : CGFloat = Math.randomCGFloat(
     min: -(self.rect?.size.width)!, 
     max: (self.rect?.size.width)! 
    ) 

    let returnCGPoint : CGPoint = CGPoint(
     x: x, 
     y: y 
    ) 
    return returnCGPoint 
} 

ランダム世代関数[すべての私の数学関数の別のクラスインチ]

/** 
Generate a random CGFloat. 
- Parameters: 
- min: CGFloat 
- max: CGFloat 
- Returns: a CGFloat 
*/ 
static func randomCGFloat(min: CGFloat, max: CGFloat) -> CGFloat { 
    return CGFloat(Float(arc4random())/Float(UINT32_MAX)) * (max - min) + min 
} 

答えて

0

私は何が起こっていたかを考え出したと思います。

パーティクルの初期配列を作成したとき、私は以下を使用しました。

let newListOfParticles = Array(
     repeatElement(
      defaultParticle, 
      count: self.numberOfParticles 
     ) 
    ) 

私は、関数が各インデックスのdefaultParticlesの一意のコピーを作成すると考えました。私は間違っていた。

代わりに、この関数は参照を作成したばかりで、最初の参照を指しています。ランダム化ループは同じパーティクル上で何度も何度も繰り返し操作されていました。

私は次のリストの初期化を変更:

for _ in 1...self.numberOfParticles { 

     newListOfParticles.append(RegionParticle(withRegion: self)) 

    } 

したがって、各エントリは今、真にユニークであり、それは問題を解決するように見えました。

私は部分的に狂っていました。

関連する問題