一尘不染

将随机值分成四个总和

algorithm

我有一个像24这样的值,并且我有四个文本框。如何动态生成四个总计为24的值?

所有值都必须是整数,并且不能为负,结果不能为6、6、6、6;它们必须不同,例如:8、2、10、4。(但是5、6、6、7可以。)


阅读 246

收藏
2020-07-28

共1个答案

一尘不染

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数组中存在的问题。

编辑2:

对数组进行混洗确实消除了将高值作为第一个值的可能性增加。

2020-07-28