【问题标题】:Select K unique random numbers from range with sum equal to S从总和等于 S 的范围中选择 K 个唯一随机数
【发布时间】:2016-01-13 10:53:10
【问题描述】:

我有一个范围

R = {0, ..., N}

我喜欢得到总和等于SK 元素,但应该随机选择元素。

因此,一种简单的蛮力方法是确定包含K 数字的所有元素组合,从而产生S,并随机选择其中一个组合。

我正在尝试考虑一个递归解决方案,其中选择一个随机数,然后问题减少到找到总和等于 (S - K0) 的 (K-1) 个随机数,但这不需要在解决方案中产生。

有更好的方法吗?

一个样本是:

R = {0,1,2,3,4,5}, S = 5, K = 2
Solutions: randomly pick one of {{1,4};{2,3};{0.5}}

【问题讨论】:

  • 输入集中的给定数字可以多次使用吗?
  • 在您的示例中,解决方案 {0, 5} 是否正确?
  • @MichałKomorowski 是的,没错,错过了
  • @MichałKomorowski:不,数字必须是唯一的

标签: algorithm random


【解决方案1】:

一般来说,如果K很大(那么N也很大),而且S又不会太小,这是不可预测的,因为,有两个很多组合。

蛮力:尝试各种组合。你肯定会找到一个解决方案,如果存在的话,但如果超过,比如说,1 Md,或者有点,几乎不可能把它们都列出来。

您的算法:

要随机选择,你的算法是可以的:随机取一个数字,然后另一个,...

但是你做了一个假设:你选择的数字存在一个解决方案:你不知道。

那又怎样?如果统计上存在许多解决方案,您可以这样找到它,也许,或者也许没有

一些小径:

1 使用 S/K

如果每个数字

如果每个数字> S/K,那是不可能的。

假设有数字 S/K

2 只保留数字

3 想法:如果 S 很大,而数字很小,你就有可能存在许多组合。

算法思路

1随机取一个数N1

2 如果 N1 S/K

3计算N1+N2:如果S/K,如果没有

4 在每一步迭代:如果 sum S/K,如果不是

5 通过将 S/K 替换为 (S-sum N1,N2,...)/(K-n),您可以获得更好的精度

如果一步找不到任何号码,请回溯

希望对你有帮助

【讨论】:

    【解决方案2】:

    我将从 Dirichlet 分布 (https://en.wikipedia.org/wiki/Dirichlet_distribution) 开始。使用它,您可以在 (0..1) 个分布的随机数 Xi 中均匀采样,使得 SumiXi = 1。

    对于S <= N,很容易看出超出S 的采样是没有用的,应该直接拒绝。

    所以,结合接受/拒绝,类似的东西

    • 将区间 [0...1] 划分为 S(或 S+1,如果允许为 0)相等的 bin。
    • 来自 Dirichlet 分布的 K 数字示例。
    • 将采样数字映射到 bin 索引,因此您现在已经采样了整数,它们是 均小于或等于 S 且总和等于 S
    • 如果所有整数都是不同的,则接受抽样,否则拒绝抽样并转到第 2 步

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-09
      • 2011-08-02
      • 2019-07-17
      • 1970-01-01
      相关资源
      最近更新 更多