排列组合——排列

作者: 勇赴 | 来源:发表于2017-01-04 16:12 被阅读253次

    学习概率论与数理统计,要用到排列组合的知识,更重要的是要用到排列组合的思维方法,因此,学习概率与统计是很有必要了解一下排列组合的知识的。

    以下是两道比较简单的关于排列的问题,相信文科生也是能解的。

    题1、三个数字1、2、3,把这三个数字组合成一个三位数,那么能组合成多少个数字,这些数字分别是什么?百位、十位和个位不重复的数有多少个,这些数字分别是什么?
    解:先列出百位数为1的所有数:111,112,113,121,122,123,131,132,133总共9个数。然后是百位数为2的所有数:211,212,213,221,222,223,231,232,233总共9个数。最后是百位数为3的所有数:311,312,313,321,322,323,331,332,333总共9个数。
    1、2、3能够组成的三位数总共是27个,求百、十、个位不重复的数也很简单,把上面数字中百、十、个位有重复去除:123,132,213,231,321,312,不重复的排列数为6。

    题2、三个数字1、2、3,把这三个数字组合成一个两位数,那么能组合成多少个数字,这些数字分别是什么?十位和个位不重复的数有多少个,这些数字分别是什么?
    解:
    先列出十位数为1的所有数:11,12,13总共3个数。
    然后是十位数为2的所有数:21,22,23总共3个数。
    最后是十位数为3的所有数:31,32,33总共3个数。
    1、2、3能够组成的两位数总共是9个,把上面数字中十位和个位有重复去除:12,13,21,23,31,32,不重复的排列数为6。

    以上方法虽然有点笨,但还是能手工解出来的,那么如果换成四位1、2、3、4或五位1、2、3、4、5个数呢?再狠一点,手机号码为11位,问以138开头共可以组成多少个手机号码?估计再用这个方法去解就麻爪了。

    为什么我们要学点数字知识呢?其实数字并不仅仅只是买菜算算账,1+1=2这些简单的数字运算,数学更多的是逻辑推理和抽象总结。排列的定义就很简单,一个公式就抽象概括了排列的问题。

    排列的定义:从n个不同元素中,任取m(m≤n,m与n均为自然数,下同)个元素按照一定的顺序排成一列,叫做从n个不同元素中取出m个元素的一个排列;从n个不同元素中取出m(m≤n)个元素的所有排列的个数,叫做从n个不同元素中取出m个元素的排列数,用符号 A(n,m)表示。

    计算公式为:

    不可重复排列数公式.png

    流式记法:A(n,m)=n(n-1)……*(n-m+1)=n!/(n-m)!(*为乘号,/为符号,A-Arrangement为排列数,在旧教材为P-Permutation),n!表示阶乘,如6!=6x5x4x3x2x1,别外规定0!=1

    当n>m时称为选排列,n=m时称为全排列。另外排列又分元素可以重复的排列和元素不允许重复的排列,上面的公式是求不允许重复排列数的公式,可以重复的排列数计算公式为:

    可重复排列数公式.png

    流式记法:A(n,m)=n^m,也就是n的m次方

    所以根据公式,题1不重复排列数就是A(3,3)=3!/(3-3)!=1*2*3*1=6,重复排列数就是A(3,3)=33=27;题2不重复排列数就是A(3,2)=3!/(3-2)!=1*2*3*1=6,可重复排列数就是A(3,2)=32=9。

    import math
    from tkinter import *
    class Window:
        def __init__(self, title='排列数计算器', width=300, height=120, staFunc=bool, stoFunc=bool):
            self.w = width
            self.h = height
            self.stat = True
            self.staFunc = staFunc
            self.stoFunc = stoFunc
            self.staIco = None
            self.stoIco = None
    
            self.root = Tk(className=title)
    
        def drawCenter(self):
            ws = self.root.winfo_screenwidth()#用户屏幕宽度
            hs = self.root.winfo_screenheight()#用户屏幕高度
            x = int( (ws/2) - (self.w/2) )#距屏幕左边框的像素点数
            y = int( (hs/2) - (self.h/2) )#距屏幕上边框的像素点数
            self.root.geometry('{}x{}+{}+{}'.format(self.w, self.h, x, y))
        
        def createWidgets(self):
            Label(self.root, text="所有元素数n:").grid(row=0,sticky=E)
            Label(self.root, text="取出的元素数m:").grid(row=1,sticky=E)
            Label(self.root, text="不可重复排列数:").grid(row=2,sticky=E)
            Label(self.root, text="可重复排列数:").grid(row=3,sticky=E)
            self.e1 = Entry(self.root)
            self.m = StringVar()
            self.e2 = Entry(self.root,textvariable=self.m)
            self.a1 = StringVar()
            self.e3 = Entry(self.root,textvariable=self.a1)
            self.a2 = StringVar()
            self.e4 = Entry(self.root,textvariable=self.a2)
            self.e1.grid(row=0, column=1)
            self.e2.grid(row=1, column=1)
            self.e3.grid(row=2, column=1)
            self.e4.grid(row=3, column=1)
            self.btnSer = Button(self.root, command=self.click, width=3, height=1,text='运行')
            self.btnSer.grid(row=4,column=1,sticky=E)
            btnQuit = Button(self.root, text='关闭窗口', command=self.root.quit, width=8, height=1)
            btnQuit.grid(row=4,column=2)
    
        def click(self):
            n=int(self.e1.get())
            m =int(self.e2.get())
            #不可重复排列数
            a1=math.factorial(n)/math.factorial(n-m)
            self.a1.set(int(a1))
            #可重复排列数
            a2=math.pow(n,m)
            self.a2.set(int(a2))
            
        def loop(self):
            self.root.resizable(False, False)   #禁止修改窗口大小
            self.createWidgets()
            self.drawCenter()                       #窗口居中
            self.root.mainloop()
    
    if __name__ == '__main__':
        w = Window(width=350, height=150)
        w.loop()
    

    以上是排列数计算器python代码,下图为关于手机号以138开头共可以组成多少个手机号码的答案截图,由于前三位138已经确认,所以只需要确认后8位的数字,就可以组成11位数字的手机号,0-9有十个数,取8位数,得出可重复的排列数有1亿个,如果手机号是12位的话,就会有10亿个手机号,全国人民用一个号段就差不多够用了。


    手机号.png

    相关文章

      网友评论

      本文标题:排列组合——排列

      本文链接:https://www.haomeiwen.com/subject/zbbovttx.html