2017-02-08 36 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)) 

    } 

所以每个条目现在是真正独一无二的,而且似乎来解决这个问题。

所以我只是部分疯狂。