鉴于生成的256个元组:
Tuples[{a,b,c,d},4] = {{a,a,a,a},{a,a,a,b}...,{d,d,d,d}}
我想过滤所有具有3种类型的元组。例如,我想保留{c,b,c,c}& {a,a,d,a}等。但不是{d,d,d,d}或{a,b,b,c}。
我知道有:
Binomial[4,3]*4*3 = 48
从简单的数学中得到这样的元组。但我正在寻找一种计算方法来计算这些。
我的最终目标是来自元组:
Tuples[{1,2,3,...,n},k]
我想知道这些元组中有多少只有一个具有m类的子集,其中所有其他子组的大小都小于m。
如果您感兴趣,这个问题就会产生这样的问题:在游戏“反对人类的卡片”之前赢得的平均轮数是多少?假设我们有n个玩家并且第一个拥有x卡的人获胜。
答案 0 :(得分:2)
这将找到你的48个元组
Select[Tuples[{a, b, c, d}, 4],
MatchQ[Sort[#], {a_, a_, a_, b_} | {b_, a_, a_, a_}] &&
Length[Union[#]] != 1 &]
这将显示超过1,...,6的四个项目的元组,其中m个相同的项目,而所有其他项目的出现次数少于m次。
m = 2;
f[v_] := Module[{runlens},
runlens = Sort[Map[Length, Split[Sort[v]]]];
runlens[[-1]] == m && If[Length[runlens] == 1, True, runlens[[-2]] < m]]
];
Select[Tuples[Range[6], 4], f]
对结果使用Count,你知道你有多少。
答案 1 :(得分:1)
另一种方法:
Select[ Tuples[{a, b, c, d}, 4] ,
((Count[#, 3] == 1 && Max[#] == 3) &@Tally[#][[All, 2]] ) & ]
当然,如果设置的大小超过列表长度的一半,则检查Max
和Count