2017-02-08 49 views
0

我在Swift 3.0中產生一個奇怪的問題,生成隨機數字[在這種情況下CGPoints]。我正在嘗試構建一個非常簡單的粒子濾波器,並且我最初使用下面的代碼隨機化所有粒子。你如何在Swift 3.0中爲數組中的每個元素強制生成隨機數?

當我遍歷我的'粒子'集時,會生成一個唯一的隨機點[GOOD],但每個粒子都會得到完全相同的唯一隨機點[BAD]。我不確定我在做什麼錯誤,以確保每個粒子得到一個獨特的隨機點

任何人有任何建議,我可以強制每個粒子獲得一個獨特的隨機點?

由於

斯坦

問題的作用。

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

OK,我想我想通了什麼事情。

當我創建粒子的初始數組時,我使用了以下內容。

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

我認爲函數會爲每個索引創建defaultParticles的唯一副本。我誤解了。

取而代之,該函數只是創建了引用,指向初始引用。所以隨機循環只是反覆操作同一個粒子。

我改變了列表初始化爲以下內容:

for _ in 1...self.numberOfParticles { 

     newListOfParticles.append(RegionParticle(withRegion: self)) 

    } 

所以每個條目現在是真正獨一無二的,而且似乎來解決這個問題。

所以我只是部分瘋狂。

相關問題