2017-02-08 15 views
0

Swift 3.0에서 난수 생성 [이 경우 CGPoints]에서 이상한 문제가 있습니다. 아주 간단한 입자 필터를 만들기 위해 노력하고 있으며, 처음에는 아래 코드를 사용하여 입자를 무작위로 추출하는 데 문제가 있습니다.Swift 3.0에서 배열의 각 요소에 대해 어떻게 난수 생성을 강요합니까?

'입자'세트를 반복 할 때 고유 한 무작위 포인트가 생성되지만 [우수] 각 입자는 똑같은 고유 한 임의 포인트 [배트]를 얻습니다. 각 입자가 고유 한 무작위 점을 얻도록하기 위해 내가 뭘 잘못하고 있는지 확신하지 못합니다.

누구나 각 입자가 고유 한 무작위 지점을 얻도록 할 수있는 방법이 있습니까?

감사

스탠

문제점 기능. 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)) 

    } 

그래서 각 항목은 이제 진정으로 독특하고, 그 문제를 해결하기 위해 듯 :

나는 다음에 목록 초기화를 변경했습니다.

나는 부분적으로 미쳤다.