我有一个值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)

这不是一个最终的答案,但它应该是一个(好的)起点。
工作原理:需要两个参数。随机值的数量(在您的情况下为4)和总数量(在您的情况下为24)。
它接受一个介于总数和0之间的随机值,将其存储在一个数组中,并从一个变量中减去该变量,该变量存储剩余的数量并存储新值。
然后在剩余量和0之间获取一个新的随机值,将其存储在数组中,然后再次从剩余量中减去该值并存储新值。
当它是所需的最后一个数字时,它将看到剩余的数量并将其添加到数组中
编辑:
+1添加到随机值可以消除数组中存在0的问题。
编辑2:
对数组进行洗牌确实会减少将高值作为第一个值的可能性。

关于algorithm - 将随机值分成四个总和,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30154718/

10-12 14:50