当前课程知识点:Python 交互式程序设计导论 > 第1周 > A 课程视频(函数) > 随机函数
返回《Python 交互式程序设计导论》慕课在线视频课程列表
今天我们要关注的一个问题是随机函数
随机是个非常有意思的问题
在现实生活中 随机问题实际上是很常见的
举个简单的例子
咱们中国福利彩票开奖就是个非常典型的随机过程
在程序设计过程当中实际上很多问题都需要用到随机函数
下面呢我们就开始今天的内容
在程序设计中某些应用场景需要程序的行为具有不可预测性
在这里呢 我举了两个经典的游戏的例子
左侧这个是著名的俄罗斯方块
这个方块呢从界面的正上方进入界面
但是你不能预知我得到的是哪一组图形
右侧的这个呢是切水果的这样的游戏
从界面的下方抛出各种各样的水果
随机抛出炸弹
那么这些也是不可预测的它也具有随机性
计算机生成随机事件的思想主要变现为随机数
换句话说计算机要想实现真正的随机性是通过产生随机数来完成的
那么自然而然就有一个问题需要我们思考
计算机是有固定的计算规则和运行模式
那在这中条件下
可以产生真正的不可预知的结果吗
可以产生真正的随机数么
答案是否定的
实际上现有的计算机的这种运行规则固定
和固定的运行模式是不可能产生真正的随机数的
那么我们把计算机产生的随机数称之为伪随机数
原因就在此
所谓的伪随机数
就是假的随机数
同学们可能会问为什么这种假的随机数
我们还拿来当成真的随机数来用呢
实际上伪随机数他也满足两个条件
第一从统计的观点来看它们是随机的
第二用户事先很难预知这个结果
满足这两个条件也就是说它满足了一定的随机性
我们就可以把它当成一种随机数来使用
在Python当中提供了很多产生随机数的函数
我们把它称之为随机函数
那么在这张表当中我列出来了
常用的有5个
左边是函数的使用的一个方法
右边是函数的功能说明
这些函数呢我们在pycharm的开发环境当中会给大家做详细的介绍
在这呢我们先简单的浏览一下
第一个函数random.random()
这个函数呢产生的是0至1.0之间的随机数
注意我在这是0.0至1.0的随机数
也就意味着它产生的一个实数
或者是一个浮点数
而且是小于1的大于0的
那么注意不包括1.0
也就是不包括右边界
看到这同学们会问
为什么这个函数的名字前面有个rondom.然后才是函数名呢
大家注意这个函数是包含在random这个软件包当中或者这个库当中
所以我们调用这个函数的时候需要把它的库名也带上
那么再看第二个例子
第二个函数呢叫Random.randint(start,stop)
产生一个随机整数
int是整数的意思
那么它依然前面要加一个random这个包文件的名字
这个.大家可以理解为“的”
就是random这个包底下的randint这个函数
这个函数有两个参数
一个是start 一个是stop
start和stop顾名思义一个是起始 一个是终止
这个函数的功能是生成start到stop之间的随机整数
包括stop 也就是说左右边界都包括
假设我要产生一个1到3的这样一个随机整数
我就可以把start设置为1把stop设置为3
1 2 3都有可能 而且是等概率的
第三个函数呢 是random.randrange()
这个含义呢在一定范围内产生一个随机数
它有3个参数分别是start stop 和step
这个start和stop的含义呢跟上面这个函数是一样的
这是起始位置和终止位置
这个 step是步长
什么意思
实际上它是生成在start和stop之间的
以step为步长的随机整数
比如说我生成start1到stop10之间的
step为2的随机整数
那么它就可以生成 1 3 5 7 9
它步长是2
步长也就是说间隔是2
那么常用的方法呢大概有这样3种
一种是random.randrange(stop)加一个参数stop
第二种random.randrange(start,stop)
第三种random.randrange(start,stop,step)
三个参数
这些用法呢我在这先不详细讲解
我们一会在pycharm实际开发环境当中给大家讲解
第四个函数呢 是choice
choice 英文意思是选择的意思
那么random这个包底下的choice函数几个参数
一个(a_seq)这个函数很特殊
它并不是一个数
它是一个list 它是一个列表
它的含义是 返回一个非空序列a_seq的随机元素
也就是说你给它一个非空的序列
它可以返回这个序列当中的某一个元素
这个我也会具体举例给大家说
最后一个呢 叫random.shuffle(a_list)
当然这个参数名字是随意取的
那么这个函数的意思是
随机排列列表a_list中的元素
也就是把这个列表当中的元素乱序 打乱它的顺序
这些函数呢我们随后在pycharm当中给大家逐一讲解
下面一个有意思的问题 也是非常重要的问题
我想跟大家讨论一下 随机种子
什么叫随机种子
这是一个很有意思的问题
那么计算机产生随机数呢 是这样一个机理
计算机会为一个产生随机数的算法
我们把它称为随机函数
随机种子作为一个输入值
输入到这个输入函数当中
经过一个复杂的数学上的运算模型
计算得出一个随机数
那么随机种子 我们在前面的函数当中
并没有显示的或者说明显的明确的设置
这个时候计算机会自动默认为系统时间
同学们请注意 如果以系统时间为随机种子
输入这个随机函数 产生的随机数
这样一个过程 大家可以想一下
系统时间是每分每秒的在发生变化
换句话说 随机种子是每一刻都在发生变化
这就决定它有条件有方法可以生成随机数
也就是说随机种子是在变化的
那么能不能人为指定这个随机种子呢
是可以的
通过random这个包底下的seed这个函数
可以指定随机种子
换句话说 人如果直接指定这个随机种子
也就确定了生成随机数的初始条件
通过一个固定的算法它得到的随机数 也是确定的
好 下面呢我们在pycharm环境当中给大家做讲解和演示
在pycharm中
我们将对课件中提到的5个随机函数进行逐一的讲解和示范
除此之外呢 我们还要研究seed这个随机种子函数的使用
它对随机数的产生究竟有什么样的影响
这个我们要在课程当中进行分析
在讲解这些随机函数之前
首先我们要导入随机函数的模块random 导入的方法呢
是通过 import random导入
导入之后 这些函数就可以正常使用
好 我们先来讲解第一个函数random
首先呢
我们定义一个变量 x =random这个模块底下的random这个函数
然后用print语句对它进行输出
好 运行一下
大家看控制台的输出是0.69等等
再运行一下
好 实际上 从这个例子上
我们可以看出 random这个函数
它返回的是0到1之间的一个随机实数
但是不包括1.0这个右边界
这点非常重要
实际上我们在使用random这个函数呢
可能更常见的一种方法或者一种使用方式是这样
我们希望得到一个区间的随机实数
比如说我们希望得到5至10之间
这个区间段之内的一个随机函数
利用random这个函数怎么实现呢
非常简单
我们可以定义一个y等于用random这个函数乘以区间的长度
长度是多少怎么算
10减5 这是区间的长度
然后再加上这个区间的左边界5
这个表达式看起来挺复杂的
实际上呢 很好理解
我们要取5到10之间的一个随机实数
首先我们要以左边界为基准 这是毫无疑问的
然后取区间的长度乘以一个小于1的随机实数
得到的就是5到10的一个随机实数
我们来输出一下 验证一下
我们把上面两句话注释一下
这样会很明确 这个结果
运行一下5.41几几
8.29几几
那么第二种方式实际上是我们更常用的一种方法
好 这是random这个函数
下面呢 我们要研究randint这个函数
randint从它这个函数名上我们就可以看出
它是随机产生一个整数
何以见得呢 int就是整型数据类型的这样一个缩写
这个函数有两个参数
一个是start一个是stop
这两个参数 一个表示左边界 一个表示右边界
一个是起点 一个是终点
举个例子 我们还是定义一个x
random模块名字加randint
好 然后给它两个参数
一个参数是1 一个参数是5
打印输出 好 运行一下
4 1 5 2 5 3 2
1 2 3 4 5都取到了
那么这个randint是什么意思呢
就是从start开始 到stop截至
在这个区间段内 取随机整数那么包括右边界5
刚才大家可以看到我们已经取到5了实际上
它是包括右边界 这点非常重要
请大家留意一下
好 这是第二个函数
下面呢 我们来看一下第三个函数
randrange这是一个范围区间的意思
这个函数猛地看上去 是有点复杂 因为它有三个参数
但实际上
如果前面2个函数你都已经搞明白的话这个函数也非常好理解
它的基本用法 有3种
分别赋予它1个参数2个参数和3个参数
我们首先来看1个参数的情况
把这两个语句注释掉
我们还是定义一个x=random.randrange()
给它一个参数 给它一个3
输出 好 运行一下 显示的结果是2
再运行一下0 2 1 好
实际上randrange()这个函数如果你给它一个参数
这个参数对应的是start stop step里面的第二个参数stop
也就是右边界
那么这句话的意思是
x取值是从0到3之间的一个随机整数
默认的左边界是0
如果你只有一个参数
它认为这是stop 就是右边界 默认的左边界是0
所以0到3的
注意它不能取右边界
所以呢
如果这个参数给的是3它只能取0、1、2
跟刚才咱们多次运行结果是吻合的
好 这是一种用法
那么还一种用法是两个参数
我再给它一个参数
比如说1 好 给个1
那么两个参数分别对应的是 start和stop
它表示是从1 到3这个区间中产生一个随机数
不包括右边界3
我们来执一下2 1 1 2
它只能取 1 和2
因为左边界是1 2
3又不能取 所以只能取1 和2
这是两个参数 分别对应的是start和stop
下一种应用情况相对要复杂一点 是3个参数
假设我们把第二个参数改成10
第三个参数我们给成2
运行一下1 5 3 9 5 1
好 实际上同学们应该能够理解
random.randrange() 三个参数是什么意思
1对应的是start 10对应的是stop 2对应的是step
这个表示的是步长或者叫间隔
它的含义是以1为左边界 以2为间隔 以10为终点取随机整数
那么大家想一想从1开始 取到10结束
步长是2或者说间隔是2
只可能取1 3 5 7 9这五个数
为了能够更加说明问题
我把这个10呢改小一点 使得它的区间变短
比如说我设置为5
好 那大家可以想一下
以5为终点 1为起点 步长为2
(能取到的数)那就是1 3 取不到5 因为不能包括右边界
所以我们运行一下 看一下结果
1 3 3 好 大家看 它只能取1和3 取不到5
这就是random.randrange(start,stop,step)
那么对这个函数来讲 大家一定要注意一点
无论这三种任何一种用法
它都不可能取到右边界 这点需要注意
我们把这个注释一下 我们来讲下一个
下一个函数choice(a_seq)
choice(a_seq)呢是从一个非空的序列里面随机选择一个元素
那么有些同学会问 什么叫非空序列呢
非空序列呢有很多种 在Python中
我们最常用的就是字符串 之前同学们也接触过
所以我们就以字符串为例 给大家做一个演示
我定义一个变量s等于字符串a b c d
那么我们再定义一个变量c用random.choice(s) 参数为s
这句话的意思呢就是从s这个字符串当中
随机选择一个元素把它赋给c
然后我们把c输出一下
好 运行一下 是c 再运行一下 d 再运行一下 b
那么很明显
我们是从这个abcd这个字符串当中随机选取了一个元素
这个字符串就是我们所谓的非空序列
当然 除了字符串以外 还有没有别的 也有
比如说我们后面要学到的列表
因为同学们还没有接触过这个概念
我们在这就以字符串为例
好 下面呢 我们来讲最后一个函数shuffle(a_list)
shuffle(a_list)的含义呢
是对一个列表进行重新排序或者打乱它的顺序
这个怎么去用呢 我们来看看 先举一个例子
定义一个s等于 首先定义一个列表
我定义a b c
然后我用random.shuffle(s) 给它一个参数s
然后用print输出语句对s进行输出
好 运行一下 大家可以看到
s本来是a b c这个顺序
用shuffle()这个函数呢对它进行重新排序或者打乱顺序
它显示的结果是b c a 我们再来运行一下
b a c b c a c a b
那么这个呢就有点像我们在打扑克的时候洗牌的过程
实际上呢就是把这个列表进行乱序的过程
那么最后呢我们来研究下seed()这个函数
前面在课件当中提到过
seed()是用来设置随机种子的
我们在前面五个函数的讲解过程当中
同学们发现我们并没有人为的来设计随机种子
系统会自动以系统时间作为种子
输入到这个随机函数的这个算法当中返回一个随机数
所以看上去我们返回的这个数据是随机
那么如果我们人为的指定随机种子
上述的这些随机函数呢返回的结果就是固定的
举个例子
random.seed()如果我把这个随机种子写固定就是1
好 然后我们再定义一个变量让它产生一个随机整数
random.randint()我们用int这个函数来生成一个随机整数
比如说我们从1取到5
好 然后呢 我们来输出x 运行一下
它返回的结果是2
前面的这个我们把它注释掉
再运行一下 还是2 它会一直固定为2
因为固定的随机种子 固定的随机函数的生成算法
产生的一定是一样的 或者是一致的随机数
那么我们把这句话注释掉
好 这个时候呢随机种子又变成了系统时间
所以这个x呢又会发生变化
2 再看 5 4 会发生变化
好 总结一下
今天呢我们主要介绍了随机函数
那么随机函数在我们的程序开发当中
或者游戏开发当中 是非常常用的一类函数
那么给大家介绍了什么叫伪随机数 为什么会有这样一个称呼
另外又介绍了seed()这个随机种子的概念
那么这些函数在大家今后的程序开发过程当中
会经常用到
好 今天的课就讲到这里
-课程简介
--课程简介
-A 课程视频(算数操作符及表达式)
--绪论
-B 课程视频(变量及赋值)
--变量
--项目提交
-C 辅助视频(计算机结构、Python开发环境安装)
-D 辅助视频(如何提交项目)
--项目提交
-第0周--小测验
-本周项目:"我喜欢Python"
--游戏说明
--程序说明
--编码步骤
--评分标准
--项目模板
--项目提交
-A 课程视频(函数)
--函数
--其它操作符
--随机函数
-B 课程视频(逻辑及表达式)
--逻辑值和比较
--条件
--编程技巧
-第1周--小测验
-本周项目:“老虎杠子鸡虫”游戏
--游戏说明
--程序说明
--编码步骤
--评分标准
--项目模板
-A 课程视频(Python交互式应用)
--事件驱动编程
--按钮
-B 课程视频(输入框、全局变量)
--输入框
--编程技巧
-第2周--小测验A
-第2周--小测验B
-本周项目:猫咪藏在哪个房间
--游戏说明
--程序说明
--编码步骤
--评分标准
--项目模板
-A 课程视频(画布绘图)
--画布和图形绘制
--字符串处理
--图片和音效
-B 课程视频(计时器)
--计时器
--交互式绘图
--“神奇时钟”游戏
--编程技巧
-第3周--小测验A
-第3周--小测验B
-本周项目:“神奇时钟”
--游戏说明
--程序说明
--编码步骤
--评分标准
--项目模板
-A 课程视频(列表)
--列表
--键盘输入
--碰撞和反射
-B 课程视频(键盘控制)
--速度控制
--运动
--编程技巧
--“桌上冰球”游戏
-第4周--小测验A
-第4周--小测验B
-本周项目:“桌上冰球”游戏
--游戏说明
--程序说明
--编码步骤
--评分标准
--项目模板
-A 课程视频(鼠标输入、列表进阶)
--鼠标输入
--Video
--Video
--Video
-B 课程视频(字典和图片)
--Video
--Video
--Video
--Video
-第5周--小测验A
-第5周--小测验B
-本周项目:“世界杯八强连连看”
--游戏说明
--程序说明
--编码步骤
--评分标准
--项目模板
-A 课程视频(类)
--华容道中的类
-B 课程视频(平铺图片)
--平铺图片
--理解对象
--编程技巧
--“华容道”游戏
-第6周--小测验A
-第6周--小测验B
-本周项目:“华容道”游戏
--游戏说明
--程序说明
--编码步骤
--评分标准
--项目模板
-A 课程视频(类进阶及文件操作)
--集合
--文件操作
--文字块类
--处理停止的文字块
-B 课程视频(游戏状态控制)
--游戏记分规则
--编程技巧
-第7周--小测验A
-第7周--小测验B
-本周项目:决战三字经
--游戏说明
--程序说明
--编程步骤
--评分标准
--项目模板
-A、课程视屏(精灵集合)
--Video
--精灵类
--战士类
--编程技巧
-B、课程视屏(动画)
--精灵碰撞
--精灵动画
--编程技巧
--保卫家园游戏
-第8周--小测验
-本周项目:守卫家园
--游戏说明
--程序说明
--编程步骤
--评分标准
--项目模板