学习概率论与数理统计,要用到排列组合的知识,更重要的是要用到排列组合的思维方法,因此,学习概率与统计是很有必要了解一下排列组合的知识的。
以下是两道比较简单的关于排列的问题,相信文科生也是能解的。
题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)表示。
计算公式为:
流式记法: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时称为全排列。另外排列又分元素可以重复的排列和元素不允许重复的排列,上面的公式是求不允许重复排列数的公式,可以重复的排列数计算公式为:
流式记法: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亿个手机号,全国人民用一个号段就差不多够用了。