※ 引述《dinohsu1019 (杰生方的铁粉)》之铭言:
: 投资组合为1将权重k等分分配到n个股票,每个股票可分配权重0(零),1/k,2/k,...1
: (全部)将k等分分配到n个股票。
: 即“从n中取k可重复的组合”,组合数为 C(n+k-1,n-1)。
: 故权重编号范围为1~C(n+k-1,n-1)
: 权重串行(整数版)为(n,0,...0,0),(n-1,1,...,0,0),...(0,0,...,0,n)。
: 权重串行(小数版) = 权重串行(整数版)/n。
: 我的目的不是要将全部组合展开,而是要随机映射编号和组合,
: 例如:n=8, k=4时有165种组合,
: 正向:当我输入编号21时要输出 (0.375, 0.375, 0.25, 0.0)
: 反向:当我输入(0.375,0.375,0.25,0.0)要得到编号21
: 有什么方法可以计算?感谢先
: https://tinyurl.com/yvkpanm6
于是你的需求是将重复组合以某个顺序排序后直接求出该组合是排序中第几位 (及反之)
这种组合和序数转换题型有一个通用的想法是:
将这个排序顺序做成有某种分组的样子
(例如第一权重相同的全部排在一起)
然后依照这个分组顺序数过去
每数一组直接算出分组有多少元素, 然后判断你要的第 N 组是不是在这里面
发现是了的话这个分组的特性就会变成确定的组合项目
然后就能递回往下求该组内的对应组合
使用在这个题目的话, 以你所产生的顺序来看 (先不要除以总权数)
1 号组合是最后一个权重在第一档
2~9 号组合是最后一个权重在第二档
10~45 号组合是最后一个权重在第三档
46~165 号组合是最后一个权重在第四档
这是一个大分组, 每一个分组的数量可以先放一个权重在对应的档再分余下权重
所以第一大组是权重 7 分在 1 档, 计 C(1+7-1, 1-1) = C(7,0) = 1 种
第二大组是权重 7 分在 2 档, 计 C(2+7-1, 2-1) = C(8,1) = 8 种
第三大组是权重 7 分在 3 档, 计 C(3+7-1, 3-1) = C(9,2) = 36 种
第四大组是权重 7 分在 4 档, 计 C(4+7-1, 4-1) = C(10,3) = 120 种
可以验证上面算出来的正是再上面四个大组的数量
所要的 21 号组合, 因 1+8 < 21 但 1+8+36 >= 21
故知属于第三大组的 21-1-8=12 号组合
而每个大分组中又可依据这最后一档有多少权重分中组
这 36 种组合中
第三档有权重 1 的余下权重 7 分在 2 档, 计 C(2+7-1, 2-1) = C(8,1) = 8 种
权重 2 的余下权重 6 分在 2 档, 计 C(2+6-1, 2-1) = C(7,1) = 7 种
权重 3 的余下权重 5 分在 2 档, 计 C(2+5-1, 2-1) = C(6,1) = 6 种
等等
所要的 12 号组合, 因 8 < 12 但 8+7 >= 12 故知属于第二中组, 即第三档有权重 2
其为此组 (权重 6 分在 2 档) 中的 12-8=4 号组合