0
点赞
收藏
分享

微信扫一扫

数学建模-Matlab中randperm函数及其双重进阶版

googlefrank 04-09 14:30 阅读 1

1.randperm函数的用法

(1)这种用法就是参数只有一个数字,代表的含义就是随机排列之后打印输出;

我们举例的数字是4,就会把1到4这4个数字随机打乱之后随机输出,每次运行结果都不一样

所有可能的情况是n的阶乘,这里的n是4,所以一共是有24种随机的生成结果;

(2)下面的是函数里面有2个参数,第一个还是生成的数据范围,第二个是打印输出的数据的个数,这个地方的第一个参数是10,表示生成的数据范围是1到10这个区间,第二个参数是3,表示选择3个数据进行打印:

这里我们介绍一下这个函数的应用:

(3)旅行商问题

这个问题就是一个经典的旅行商问题,我们这个地方的设计路线只是其中的一小部分(这个问题还涉及到约束条件,以及最优解等等,我们这里不做讨论,只是生成一条随机的路线);

因为旅行商问题要求的是我们从随便的一个城市出发,但是最后要回到原来的位置,我们使用randperm函数生成的数据是不会相同的,因此我们把这个数组和数组里面的第一个元素在重新赋值给route就实现了第一个元素和最后一个元素相同(出发的城市和最后返回的城市一样);

(4)随机挑选学号

我们使用randperm函数,从1~50之间随机生成四个数字作为索引,根据所以找到number这个向量里面的元素(这个也是我们经常使用的);

(5)抽奖问题

我们使用函数生成下标,numel函数是求向量的大小(向量里面的元素的个数);

(6)扑克牌炸弹问题

首先介绍一下一个新的函数:ranelem函数,这个函数就是重复拷贝:

我们这道扑克牌问题,首先要生成54张扑克牌,然后进行其他的操作,我们使用repelem函数就可以生成54张扑克牌:

我们解释一下上面的代码:1~13的数字每个重复4次,再加上14,15放在一个新的向量里面,就构成了54张扑克牌。


接下来我们需要给地主20张牌,两个农民17*2=34张牌,一共就是我们的54张扑克牌;

428行代码的作用就是随机打乱,得到对应的下标;

429行就是根据下表找到对应的牌,c就是一副打乱的完整的扑克牌;

dz就是地主的首个拼音字母,我们取出前面的20个然后进行排序,这个就是地主手里面的牌

nm就是17张牌两个农民分别取出21-37和38-54的17张牌,经过排序就可以看到农民的牌;

434是进行检验的,检验三个人手里的牌和我们的所有的牌一样,返回logical说明是没有问题的


接下来我们判断地主的牌里面是否有炸弹:

(1)第一种就是判断是否有双王:

 ismember同样是一个函数,这个函数有多个返回值,这个函数在这里就会有2个返回值,在这里就是在dz(地主的牌里面),看看是否有14(小王)15(大王),如果存在就会返回1,不存在就会返回0,我们这里的返回值1和0表示的是逐次进行的随机测试没有大王15,但是有小王14,我们需判断的是否同时拥有14,15,因此我们使用all函数,如果两个返回值都是1,表示大小王都有,此时就是有炸弹,否则就是没有;

(2)第二种就是判断是否有4张相同的牌:

下面的是两种判断方法:

****第一种方法:

(1)先把地主的矩阵转置,然后看是否等于1:15,这个意思就是dz'变成了列向量,

(2)上面的那个20*15的矩阵是一列一列看的,让1和ans这个20*1的矩阵进行比较,如果这个ans里面的20个数有和1相同的,显示就是1,不相同就会显示0,20*15矩阵的第一列前面的三个是1,说明20*1的矩阵里面前面的三个和1相同,以此类推,20*15的矩阵里面第二列第四个数字是0,表明列向量里面的第四个数字是2,按照这个逻辑我们就可以得到所有的情况;

(3)每一列的结果最多有4个1,因为1~15里面的每个数字和我们的列向量进行比较,相同的牌就四张,我们进行求和就是给每一列求和,如果结果是4,表示有4张一样的牌在地主的手里;

求和发现每张牌的个数,没有4出现,则没有炸弹,所以find返回的是空向量;

****第二种利用众数

这个就是众数mode,他有3个返回值,第一个A表示众数是谁,B表示这个众数出现了几次,C表示一个元胞数组,因为如果是多个众数的话,就会只返回最小的,第三个参数就会把所有的都显示出来,以元胞数组的形式;B=4表示出现4次,ans=1就是说明有一个数字出现四次,A=12,可见上面的方法和我们的众数的方法显示的结果都是12;

2.randperm函数进阶版randsample函数

(1)基本介绍

这个用法和randperm基本一样:

从1~10这个范围里的数字中抽取三个:

第一个参数是向量,用法也是一样的:

(2)不同情况的抽取:

true:放回(一个数次可以出现多次)-----false:不放回(一个数字只能出现一次)

这里我们测试一下,第三个参数是true的时候,就可以不放回(一个数字出现两次),这里可以结合我们高中是学习的排列组合理解(拿球问题,放回和不放回,本质是一样的);

(3)带有权重的放回抽取:

权重就是被选中的概率:我们下面的例子是给了一个含有10个元素的向量,w表示对应的权重,权重的求法就是自己对应的数字除以所有的和,下面的w是1~10,10个数字里面抽三个,1的概率就是1除以所有的和(1~10的和),以此类推,越往后的概率就越大,打印的结果也证实了;

(4)示例

下面就是解决的代码:1 2 3分别代表的是吃饭,唱歌和看电影,w里面的是对应的概率,1*20的矩阵就表示第一个同学是第二个选择(sing),第二个同学是第一种选择(eat),以此类推可得;下面的find(y==1)就是去吃饭的编号,==2就是去唱歌,以此类推即可得到。

3.randsample函数进阶版datasample

(1)随机抽取矩阵的行

函数的第一个参数就是从那里抽取,第二个抽取几行或者几列,第三个参数表示维度,1表示按照行抽取,2表示按照列抽取,我们这里的1就表示为按照行抽取三行,最后的结果显示的是抽取的第4行和第5行,第四行抽取两次,如果我们把true改为false就不会出现一样的情况了(false表示的不放回);

(2)随机抽取矩阵的列

这里随机抽取3列,false不放回,结果不同,抽取的第三第四第五列。

举报

相关推荐

0 条评论