我有一个像24这样的值,并且我有四个文本框。如何动态生成四个总计为24的值?
所有值都必须是整数,并且不能为负,结果不能为6、6、6、6;它们必须不同,例如:8、2、10、4。(但是5、6、6、7可以。)
func getRandomValues(amountOfValues:Int, totalAmount:Int) -> [Int]?{ if amountOfValues < 1{ return nil } if totalAmount < 1{ return nil } if totalAmount < amountOfValues{ return nil } var values:[Int] = [] var valueLeft = totalAmount for i in 0..<amountOfValues{ if i == amountOfValues - 1{ values.append(valueLeft) break } var value = Int(arc4random_uniform(UInt32(valueLeft - (amountOfValues - i))) + 1) valueLeft -= value values.append(value) } var shuffledArray:[Int] = [] for i in 0..<values.count { var rnd = Int(arc4random_uniform(UInt32(values.count))) shuffledArray.append(values[rnd]) values.removeAtIndex(rnd) } return shuffledArray } getRandomValues(4, 24)
这不是最终的答案,但应该是一个(好的)起点。
工作原理:它需要2个参数。随机值的数量(在您的情况下为4)和总数(在您的情况下为24)。
它在Amount和Amount之间取一个随机值,将其存储在数组中,然后从变量中减去该值,该变量存储剩余的数量并存储新值。
比它在剩余的数量和0之间取一个新的随机值,将其存储在数组中,然后再次从剩余的数量中减去此值并存储新值。
当它是所需的最后一个数字时,它将看到剩余的数量并将其添加到数组中
编辑:
将a添加+1到随机值消除了0数组中存在的问题。
+1
0
编辑2:
对数组进行混洗确实消除了将高值作为第一个值的可能性增加。