【问题标题】:Give a natural positive Int (n) and a desired sum (k) find a random array with length n and sum k给出一个自然正的 Int (n) 和一个期望的总和 (k) 找到一个长度为 n 和总和为 k 的随机数组
【发布时间】:2020-04-06 09:09:51
【问题描述】:

我想要一个给定 N: IntK: Int 的函数,它返回一个数组长度 N、1...N 中的元素和总和 K。 例如: 对于 n == 3 和 k == 7 解决方案: [3, 1, 3], [3,3,1], [3,2,2] ... 我天真的解决方案是:

func arrayWith(n: Int, k : Int) -> [Int] {
    let elements = (1...n).map { $0 } // We only allow 1,2,3.... till n
    var output = [Int]()
    repeat {
        output.removeAll()
        for _ in 0..<n {
            let validNumbers = elements.filter { $0 + output.reduce(0,+) <= k }
            if let random = validNumbers.randomElement() {
                output.append(random)
            } else {
                break
            }
        }

    } while output.count != n || output.reduce(0,+) != k
    return output
}

这个解决方案刚刚好,但是时间复杂度太高了。 arrayWith(n: 7, k: 49) (只有一种可能性 [7,7,7,7,7,7,7],需要几秒钟。)

注意N,所以不需要处理无效的情况。

【问题讨论】:

  • 你的意思是 N
  • 可能有帮助:Split a random value into four that sum up to it——同样的问题,但没有每个数字最多为 N 的限制。
  • 是的,对不起,n
  • @MartinR 有很大的不同,恕我直言......
  • “随机数组”是什么意思?所有可能的数组都应该同样可能吗?你用这个干什么?

标签: swift algorithm hash


【解决方案1】:

这是一个非常简单快速的解决方案,可以生成具有给定总和和限制的随机数组:

func arrayWith(n: Int, k: Int) -> [Int] {
    var output: [Int] = []
    var sum = k // Sum of the remaining elements
    for i in 1...n {
        let lo = max(sum - (n - i) * n, 1) // Minimum possible value for the next number
        let hi = min(sum - (n - i), n) // Maximum possible value for the next number
        let x = Int.random(in: lo...hi)
        sum -= x
        output.append(x)
    }
    return output
}

我们的想法是在 1...n 范围内随机选择每个元素,但同时也受到限制,使得剩余元素仍然可以实现给定的总和。

请注意,这是一种非常简单的方法,并且不会以相同的概率产生所有可能的解决方案。改组输出数组可能会有所改善。

如需更复杂的解决方案,请查看Random numbers that add to 100: MatlabNon biased return a list of n random positive numbers (>=0) so that their sum == total_sum,其中问题是用其他语言处理的,并且是理论上的、与语言无关的方式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多