2017-02-08 9 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 
} 

Helper Функция

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

Я думал, что функция сделает уникальную копию параметров по умолчанию для каждого индекса. Я ошибался.

Вместо этого функция только что создала ссылки, обращенные к исходной. Таким образом, рандомизирующие петли работали только на одной и той же частице снова и снова.

Я изменил инициализации списка на следующее:

for _ in 1...self.numberOfParticles { 

     newListOfParticles.append(RegionParticle(withRegion: self)) 

    } 

Таким образом, каждая запись является поистине уникальным сейчас, и это, казалось, решить эту проблему.

Так что я был только частично сумасшедшим.