Crossin的编程教室

标题: 【Python 第60课】 随机数 [打印本页]

作者: crossin先生    时间: 2013-10-10 18:01
标题: 【Python 第60课】 随机数
60picrandom.jpg

有些时日没发新课了,今天来说一说python中的random模块。

random模块的作用是产生随机数。之前的小游戏中用到过random中的randint:
import random
num = random.randint(1,100)

random.randint(a, b)可以生成一个a到b间的随机整数,包括a和b。
a、b都必须是整数,且必须b≥a。当等于的时候,比如:
random.randint(3, 3)
的结果就永远是3

除了randint,random模块中比较常用的方法还有:

random.random()
生成一个0到1之间的随机浮点数,包括0但不包括1,也就是[0.0, 1.0)。

random.uniform(a, b)
生成a、b之间的随机浮点数。不过与randint不同的是,a、b无需是整数,也不用考虑大小。
random.uniform(1.5, 3)
random.uniform(3, 1.5)
这两种参数都是可行的。
random.uniform(1.5, 1.5)永远得到1.5。

random.choice(seq)
从序列中随机选取一个元素。seq需要是一个序列,比如list、元组、字符串。
random.choice([1, 2, 3, 5, 8, 13]) #list
random.choice('hello') #字符串
random.choice(['hello', 'world']) #字符串组成的list
random.choice((1, 2, 3)) #元组
都是可行的用法。

random.randrange(start, stop, step)
生成一个从start到stop(不包括stop),间隔为step的一个随机数。start、stop、step都要为整数,且start<stop。
比如:
random.randrange(1, 9, 2)
就是从[1, 3, 5, 7]中随机选取一个。
start和step都可以不提供参数,默认是从0开始,间隔为1。但如果需要指定step,则必须指定start。
random.randrange(4) #[0, 1, 2, 3]
random.randrange(1, 4) #[1, 2, 3]
random.randrange(start, stop, step)其实在效果上等同于
random.choice(range(start, stop, step))

random.sample(population, k)
从population序列中,随机获取k个元素,生成一个新序列。sample不改变原来序列。

random.shuffle(x)
把序列x中的元素顺序打乱。shuffle直接改变原有的序列。

以上是random中常见的几个方法。如果你在程序中需要其中某一个方法,也可以这样写:
from random import randint
randint(1, 10)

另外,有些编程基础的同学可能知道,在随机数中有个seed的概念,需要一个真实的随机数,比如此刻的时间、鼠标的位置等等,以此为基础产生伪随机数。在python中,默认用系统时间作为seed。你也可以手动调用random.seed(x)来指定seed。

最后,有些同学询问编程教室网站的开发情况,这里给大家简单汇报一下:目前我们已经基本上把核心的功能确定下来,也画了些页面草图。接下来会去做更详细的设计,敬请期待!


#==== Crossin的编程教室 ====#
微信ID:crossincode
论坛:http://crossin.me
QQ群:156630350

面向零基础初学者的编程课
每天5分钟,轻松学编程



作者: blake    时间: 2013-10-10 22:23
请问一下,哪儿可以找到比较全的python作为文档呢?
作者: crossin先生    时间: 2013-10-11 10:09
blake 发表于 2013-10-10 22:23
请问一下,哪儿可以找到比较全的python作为文档呢?

英文能看得懂的话,可以去python官网:http://www.python.org/doc/
这是最全的

另外有一些书,专门讲python模块的,比如这本《python标准库》http://pan.baidu.com/share/link? ... 85&uk=204484850
不过它也不是全部都写上去了
作者: 阿努比斯    时间: 2013-10-21 09:52
QQ截图20131021094742.png
先生,我想使用choice做一些检验的时候,老是会出现上图的情况,请问是什么原因,谢谢了
作者: crossin先生    时间: 2013-10-21 11:07
阿努比斯 发表于 2013-10-21 09:52
先生,我想使用choice做一些检验的时候,老是会出现上图的情况,请问是什么原因,谢谢了 ...

转网上的解决方案:

简单一点说就是IDLE被防火墙屏蔽,不允许访问网络。实际上了呢,IDLE也根本没有需要去访问网络,只是使用socket来进行进程间的通讯。

在网上找找,解决方案有这么几条:
1. 在防火墙中规则中添加python目录下的pythonw.exe文件,并允许它访问网络。

2. 给IDLE的快捷方式加上"-n"参数,让IDLE不使用subprocess。在快捷方式的属性里改“目标”。

3. 修改[Python目录]\Lib\idlelib\PyShell.py文件,在1300行附近,将
use_subprocess = True
修改为:
use_subprocess = False
作者: crossin先生    时间: 2013-10-21 11:07
阿努比斯 发表于 2013-10-21 09:52
先生,我想使用choice做一些检验的时候,老是会出现上图的情况,请问是什么原因,谢谢了 ...

转网上的解决方案:

简单一点说就是IDLE被防火墙屏蔽,不允许访问网络。实际上了呢,IDLE也根本没有需要去访问网络,只是使用socket来进行进程间的通讯。

在网上找找,解决方案有这么几条:
1. 在防火墙中规则中添加python目录下的pythonw.exe文件,并允许它访问网络。

2. 给IDLE的快捷方式加上"-n"参数,让IDLE不使用subprocess。在快捷方式的属性里改“目标”。

3. 修改[Python目录]\Lib\idlelib\PyShell.py文件,在1300行附近,将
use_subprocess = True
修改为:
use_subprocess = False
作者: 阿努比斯    时间: 2013-10-21 16:26
crossin先生 发表于 2013-10-21 11:07
转网上的解决方案:

简单一点说就是IDLE被防火墙屏蔽,不允许访问网络。实际上了呢,IDLE也根本没有需要 ...

好的,真是辛苦您了
作者: fuyuanjun12    时间: 2014-6-24 09:23
import random
a=[1,3,5,7,9,11,13,15,17,19]
b= random.shuffle(a)
print b
先生,怎么这个的结果是None?
作者: crossin先生    时间: 2014-6-24 19:36
fuyuanjun12 发表于 2014-6-24 09:23
import random
a=[1,3,5,7,9,11,13,15,17,19]
b= random.shuffle(a)

shuffle没有返回值,它直接对a进行操作
你print a看看
作者: fuyuanjun12    时间: 2014-6-27 11:42
crossin先生 发表于 2014-6-24 19:36
shuffle没有返回值,它直接对a进行操作
你print a看看

原来是这样,没有返回值,直接改变a。
恩,直接print a 是看到了乱序后的list,谢谢!
作者: liu-pengfei    时间: 2014-9-27 00:22
crossin先生 发表于 2013-10-11 10:09
英文能看得懂的话,可以去python官网:http://www.python.org/doc/
这是最全的

不知道安装目录下,xx:\Python27\Doc\中的是不是文档呢?
作者: liu-pengfei    时间: 2014-9-27 00:25
先生,这些函数不用记下来吧,用的时候查询一下,用多的就自然记下了,是不是?
作者: crossin先生    时间: 2014-9-27 13:20
liu-pengfei 发表于 2014-9-27 00:25
先生,这些函数不用记下来吧,用的时候查询一下,用多的就自然记下了,是不是? ...

对的,知道在哪里查,怎么查就行了
作者: 草办    时间: 2015-12-14 16:41
get
作者: catherinemic    时间: 2016-2-12 14:44
crossin老师,新年快乐~~我不太懂seed究竟是什么呢?查了一些文章也还是不太懂它的用法~~
作者: crossin先生    时间: 2016-2-12 22:51
catherinemic 发表于 2016-2-12 14:44
crossin老师,新年快乐~~我不太懂seed究竟是什么呢?查了一些文章也还是不太懂它的用法~~ ...

随机数在电脑中的实现并不是绝对的“随机”。所以为了增加随机性,需要某个输入来作为seed。通常会用时间,或者类似鼠标位置之类的
作者: brahmagupta    时间: 2017-3-2 13:59
random.shuffle()所用的参数(序列)必须是 list 么?
比如说
a = ['h','e','l','l','o']
random.shuffle(a)是可以的。

但是用字符串 a = "hello"就不行了?
是不是因为在python中存储的字符串str和元组tuple一样,是 不可以对它们进行操作的(测试了一下,赋值操作是不允许的/does not support item assignments)?(类似于一个静态变量?)
作者: brahmagupta    时间: 2017-3-2 14:01
本帖最后由 brahmagupta 于 2017-3-2 14:48 编辑

再问一个。。如何 把字符串  a = "hello" 分割成['h','e','l','l','o']这种单个字母组成的list?.split()的方法不能实现的话就只能自己写函数了是么?
作者: brahmagupta    时间: 2017-3-2 14:51
想起来了 可以直接这样写。。 a = list("hello")用 list创建即可。。
或者用
a = []
a.extend("hello")
用list的extend方法实现。
作者: crossin先生    时间: 2017-3-2 16:42
brahmagupta 发表于 2017-3-2 13:59
random.shuffle()所用的参数(序列)必须是 list 么?
比如说
a = ['h','e','l','l','o']

是的,字符串本身不可改




欢迎光临 Crossin的编程教室 (https://bbs.crossincode.com/) Powered by Discuz! X2.5