python从源码讲解random模块⽬录
我们先来看⼀看random模块中有多少个⽅法
⽽此⽂章要讲解的⽅法主要有如下⼏个:
1.random.random()
2.random.uniform()
3.random.randrange()
4.random.randint()
5.random.choice()
6.random.shuffle()
7.random.sample()
1.random.random()
简介:
random.random()
作⽤:
⽤于⽣成⼀个0到1的随机浮点数
注意:
⽣成的浮点数的范围为0<= n < 1.0
源码:
def random(self):
"""Get the next random number in the range [0.0, 1.0)."""
return (int.from_bytes(_urandom(7), 'big') >> 3) * RECIP_BPF
这⼀句话是返回从区间[0,1)的随机浮点数
我们设计⼀段代码:
import random
if __name__ == '__main__':
print(random.random())
控制台输出:
2.random.uniform()
random.unifor(a, b)
作⽤:
⽤于⽣成⼀个指定范围内的随机符点数,两个参数其中⼀个是上限,⼀个是下限。
注意:
如果a > b,则⽣成的随机数n: b <= n <= a。如果 a <b, 则 a <= n <= b
源码:
def uniform(self, a, b):
"Get a random number in the range [a, b) or [a, b] depending on rounding."
return a + (b - a) * self.random()
我们发现这个⽅法有调⽤了random()⽅法,我们知道random()⽅法返回的是[0,1)的随机浮点数,那么uniform()⽅法,因为a不⼀定严格⼩于b,a也可能等于b,如果a=b,那么返回的就是a,⼜因为a也可以⼤于b,所以返回值范围为[a,b],为左闭右闭区间
我们设计⼀段代码:
import random
if __name__ == '__main__':
print(random.uniform(2,4))
控制台输出:
3.random.randrange()
简介:
random.randrange(start, stop, step)
作⽤:
从指定范围内,按指定基数递增的集合中获取⼀个随机数
注意:
该⽅法返回的随机值是左闭右开的,也就是取不到stop的值
举例:
random在python中的意思random.randrange(10, 30, 2),结果相当于从[10, 12, 14, 16, ... 26, 28]序列中获取⼀个随机数。查看源码:
def randrange(self, start, stop=None, step=1):
"""Choose a random item from range(start, stop[, step]).
This fixes the problem with randint() which includes the
endpoint; in Python this is usually not what you want.
"""
# This code is a bit messy to make it fast for the
# common case while still doing adequate error checking.
istart = int(start)
if istart != start:
raise ValueError("non-integer arg 1 for randrange()")
if stop is None:
if istart > 0:
return self._randbelow(istart)
raise ValueError("empty range for randrange()")
# stop argument supplied.
istop = int(stop)
if istop != stop:
raise ValueError("non-integer stop for randrange()")
width = istop - istart
if step == 1 and width > 0:
return istart + self._randbelow(width)
if step == 1:
raise ValueError("empty range for randrange() (%d, %d, %d)" % (istart, istop, width))
# Non-unit step argument supplied.
istep = int(step)
if istep != step:
raise ValueError("non-integer step for randrange()")
if istep > 0:
n = (width + istep - 1) // istep
elif istep < 0:
n = (width + istep + 1) // istep
else:
raise ValueError("zero step for randrange()")
if n <= 0:
raise ValueError("empty range for randrange()")
return istart + istep * self._randbelow(n)
我们⼏⾏代码⼏⾏代码的看。
⾸先查看前⼏⾏代码:
istart = int(start)
if istart != start:
raise ValueError("non-integer arg 1 for randrange()")
这⼏⾏代码主要是对start进⾏处理。
我们现将传参进来的start转换为int类型,然后判断,如果istart不等于start,就抛出异常我们来设计⼀段代码引出这个异常
import random
if __name__ == '__main__':
print(random.randrange(1.1, 20, 2))
控制台输出:
因为我们start传参不是int类型的,所以就抛出了这个异常
接着查看这⼏⾏代码:
if stop is None:
if istart > 0:
return self._randbelow(istart)
raise ValueError("empty range for randrange()")
这⼏⾏代码对形参stop进⾏处理
如果形参stop为None,我们就对istart进⾏判断,如果istart⼤于0,返回self._randbelow(istart),如果istart⼩于等于0,抛出异常我们来设计⼀段代码来引出这个异常
import random
if __name__ == '__main__':
print(random.randrange(0, None, 2))
控制台输出:
关于self._randbelow(istart)是什么意思,我没有到源码
于是我设计了⼀段代码
import random
if __name__ == '__main__':
print(random.randrange(2, None, 1))

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。