我一直在尝试运行此循环来更改基于数组的元素的位置,但我得到以下错误。不确定会出现什么问题。任何想法或想法!谢谢。
var population = [[98, 8, 45, 34, 56], [9, 13, 65, 4, 90], [24, 5, 4, 56, 88], [3, 55, 22, 19, 10]]
private func randomIntergerInRange(low:Int, high:Int) -> Int {
let randomGeneratedNumber = low + Int(arc4random()) % (high - low);
return Int(randomGeneratedNumber)
}
for individual in population {
var mutate = 0.01
if mutate > Double(Float(arc4random()) / Float(UINT32_MAX)) {
var positionToMutate = randomIntergerInRange(0, (individual.count - 1))
var valueToAssign = randomIntergerInRange(minElement(individual), maxElement(individual))
individual[positionToMutate] = valueToAssign
print(individual)
}
}
答案 0 :(得分:2)
数组按值传递,因此当您在每次迭代时使用int
时,会为其分配individual
子数组的副本,即使您使用population
,也只会变异原始数组的副本。
如果要改变原始数组的值,可以使用索引来实现,例如:
for var individual in population ...
答案 1 :(得分:1)
错误消息的原因:循环中的individual
对象是不可变的,它是对象的副本,而不是引用。
您可以使用enumerate
:
for (index, individual) in enumerate(population) {
var mutate = 0.01
if mutate > Double(Float(arc4random()) / Float(UINT32_MAX)) {
var positionToMutate = randomIntergerInRange(0, (individual.count - 1))
var valueToAssign = randomIntergerInRange(minElement(individual), maxElement(individual))
population[index][positionToMutate] = valueToAssign
print(population[index])
}
}
你不应该在迭代时修改一个集合,顺便说一句,它可能有副作用。
更新Swift 2
private func randomIntegerInRange(low:Int, _ high:Int) -> Int {
let randomGeneratedNumber = low + Int(arc4random()) % (high - low)
return Int(randomGeneratedNumber)
}
var mutate = 0.01
for (index, individual) in population.enumerate() {
if mutate > Double(Float(arc4random()) / Float(UINT32_MAX)) {
var positionToMutate = randomIntegerInRange(0, (individual.count - 1))
if let min = individual.minElement(), max = individual.maxElement() {
var valueToAssign = randomIntegerInRange(min, max)
population[index][positionToMutate] = valueToAssign
print(population[index])
}
}
}