枚举分布

时间:2014-04-15 01:44:43

标签: combinations permutation distribution

我正在尝试创建一个文本文件,每个可能的100%分配到n个容器中?因此,对于4个容器,它看起来像这样:

0.97, 0.01, 0.01, 0.01  
0.96, 0.01, 0.01, 0.02  
0.96, 0.01, 0.02, 0.01  
0.96, 0.02, 0.01, 0.01
...  

有关实现这一目标的好方法的任何想法吗?

1 个答案:

答案 0 :(得分:0)

根据您在上述评论中的回答,这里是Ruby中的递归解决方案:

$resolution = 100
$res_f = $resolution.to_f

def allocate(remainder, bin_number, all_bin_values, number_of_bins)
  if bin_number >= number_of_bins
    all_bin_values << remainder / $res_f
    puts all_bin_values.join(", ")
    all_bin_values.pop
  else
    remainder.downto(1) do |i|
      if remainder - i >= number_of_bins - bin_number
        all_bin_values << i / $res_f
        allocate(remainder - i, bin_number + 1, all_bin_values, number_of_bins)
        all_bin_values.pop
      end
    end
  end
end

num_bins = (ARGV.shift || 4).to_i
allocate($resolution, 1, [], num_bins)

容器的数量默认为4,但您可以通过提供命令行参数在运行时覆盖它。

<强>附录

我对你的评论感到惊讶,因为一个循环的版本太快了#34;在其他条件相同的情况下,循环应该比递归更快,并且在我为这里给出的迭代版本计时时就是这种情况:

resolution = 100
res_f = resolution.to_f

resolution.downto(1) do |first|
  remainder1 = resolution - first
  remainder1.downto(1) do |second|
    remainder2 = remainder1 - second
    remainder2.downto(1) do |third|
      fourth = remainder2 - third
      printf "%g, %g, %g, %g\n", first / res_f,
        second / res_f, third / res_f, fourth / res_f if fourth > 0
    end
  end
end

虽然速度更快,但缺点是如果你想要不同数量的容器,则必须通过添加额外的嵌套循环来相应地修改代码。