你如何在Swift 3.0中强制数组中每个元素的随机数生成?

时间:2017-02-08 01:36:42

标签: random swift3 arc4random

我在Swift 3.0中产生一个奇怪的问题,产生随机数[在本例中为CGPoints]。我正在尝试构建一个非常简单的粒子滤波器,我在使用下面的代码初始化粒子时遇到了麻烦。

当我遍历我的'粒子'集时,会生成一个独特的随机点[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
}

随机gen函数[在我所有数学函数的单独类中。]

/**
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
}

1 个答案:

答案 0 :(得分:0)

好的,我想我弄清楚发生了什么。

当我创建粒子的初始数组时,我使用了以下内容。

    for _ in 1...self.numberOfParticles {

        newListOfParticles.append( RegionParticle( withRegion: self ) )

    }

我认为该函数会为每个索引创建defaultParticles的唯一副本。我错了。

相反,该函数只是创建了指向最初的引用。所以随机化循环只是一遍又一遍地在同一个粒子上运行。

我将列表初始化更改为以下内容:

{{1}}

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

所以我只是部分疯狂。