用MATLAB,把10个数随机分成四组

用MATLAB,把10个数随机分成四组,要求就是不得有空集,就是每组最少要有1个元素,而且数的顺序不能变,只能按顺序选择

你好,同学,一行代码就行了:

groups = mat2cell(1:10,1,diff([0,sort(randperm(9,3)),10]));
celldisp(groups)% 这行是显示结果

下面是一些结果(随机的运行几次):
结果1

groups{1} =
     1     2
groups{2} =
     3
groups{3} =
     4
groups{4} =
     5     6     7     8     9    10

结果2

groups{1} =
     1     2
groups{2} =
     3     4     5     6     7
groups{3} =
     8     9
groups{4} =
    10

结果3

groups{1} =
     1     2     3     4
groups{2} =
     5     6
groups{3} =
     7     8     9
groups{4} =
    10

你要获取某一个组的数据,只要通过这样写就行
s = groups{i}% i是第几组的序号即1,2,3,4,s就是你要的那个组的数字!!!

——————————————————————————————————————————————
思维扩展:
m个数,随机分成n组,要求就是不得有空集,就是每组最少要有1个元素,而且数的顺序不能变。

a = [5,4,3,1,4,5,6,7,1,9,2,1,7,2,3,1]; % a 的大小为m=16,这里就是m个数字
m = length(a); % a的元素个数
n = 4; % 自己设,反正要小于等于m,我这里设置4个组
groups = mat2cell(a,1,diff([0,sort(randperm(m-1,n-1)),m]));
celldisp(groups)%显示

给出一个随机结果

groups{1} =
     5     4     3     1
groups{2} =
     4     5     6     7
groups{3} =
     1     9     2
groups{4} =
     1     7     2     3     1

1.生成1-7之间的随机数n1作为第一组个数
2.生成1到10-n1-2之间的随机数n2
3. 1到10-n1-n2-1

n=[0,0,0,0];
n(1)=unidrnd(7);
n(2)=unidrnd(8-n(1));
n(3)=unidrnd(9-n(1)-n(2));
n(4)=10-sum(n(1:3));

原理就是在十个数之间的九个空隙随机挑三个空隙插入三个隔板,就能把十个数分成四份且每份至少有一个数
代码:

v=1:10;
groupNum=4;
[~,sep]=sort(rand([1,length(v)-1]));
sep=[0,sort(sep(1:gropNum-1)),length(v)];

for i=1:4
    group{i}=v(sep(i)+1:sep(i+1));
    disp(group{i})
end

计算结果(展示其中几次):
1
2 3
4 5 6 7 8
9 10


1 2 3
4 5
6 7
8 9 10


1 2 3 4
5
6 7 8
9 10