随机数模块函数
- 最近使用了choice、shuffle 对于字典的处理,发现些问题,于是整理一下random模块中函数使用方法及一些问题
import random as rd
复制代码
函数
- random() #随机获取0~1之间的小数
- choice(lst/tuple/dict) #随机获取序列中的值,不可以操作集合,操作字典有时会出错
- shuffle(lst/dict)#随机打乱序列,返回值为None,直接修改序列,不能操作元组和集合,操作字典有时会报错
- randrange(a,b,n)#指定区间内的整数,取值范围[a,b),不包含b,a,b可以是浮点数,但只能是n.0,a必须小于b
- uniform(a,b)#指定区间内的数值,可以是复数,取值包含a也包含b,a和b可以相等,a可以小于b
a = rd.random()
print(a)
import math
print(math.floor(rd.random()*10)/10)
复制代码
0.7688124235586536
0.3
复制代码
a = rd.choice([1,2,4,5,7])
print(a)
dict1 = {0:3,1:4,2:5}
print(rd.choice(dict1))
dict1 = {'a':3,'b':4,'c':5}
print(rd.choice(dict1))
dict1 = {1:3,6:4,7:5}
print(rd.choice(dict1))
'''random.py中对choice方法的实现如下,先得到0- (len(seq)-1)之间的整数,然后将获取到的整数作为下标去访问序列中的value,找不到就报错了
def choice(self, seq):
"""Choose a random element from a non-empty sequence."""
try:
i = self._randbelow(len(seq))
except ValueError:
raise IndexError('Cannot choose from an empty sequence') from None
return seq[i]
'''
复制代码
2
5
---------------------------------------------------------------------------
KeyError Traceback (most recent call last)
<ipython-input-3-f321c81453d3> in <module>()
7
8 dict1 = {'a':3,'b':4,'c':5}#不会报错,长度为n的元素,key为[0-n-1]的之间的整数不会报错,为其他值可能报错,全为字符串一定报错
----> 9 print(rd.choice(dict1))
D:\ProgramData\Anaconda3\lib\random.py in choice(self, seq)
256 except ValueError:
257 raise IndexError('Cannot choose from an empty sequence') from None
--> 258 return seq[i]
259
260 def shuffle(self, x, random=None):
KeyError: 2
复制代码
dict1 = {'a':3,'b':4,'c':5}
keys = list(dict1.keys())
values = list(dict1.values())
print(rd.choice(keys))
print(rd.choice(values))
复制代码
b
5
复制代码
a = [1,2,3,4,5,6]
rd.shuffle(a)
print(a)
''' 和choice相同都是通过下标访问的,所以同样会报错
def shuffle(self, x, random=None):
"""Shuffle list x in place, and return None.
Optional argument random is a 0-argument function returning a
random float in [0.0, 1.0); if it is the default None, the
standard random.random will be used.
"""
if random is None:
randbelow = self._randbelow
for i in reversed(range(1, len(x))):
# pick an element in x[:i+1] with which to exchange x[i]
j = randbelow(i+1)
x[i], x[j] = x[j], x[i]
else:
_int = int
for i in reversed(range(1, len(x))):
# pick an element in x[:i+1] with which to exchange x[i]
j = _int(random() * (i+1))
x[i], x[j] = x[j], x[i]
'''
复制代码
[3, 6, 2, 1, 4, 5]
复制代码
a = rd.randrange(1,5,2)
print(a)
复制代码
3
复制代码
a = rd.uniform(1,5)
print(a)
'''
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()
'''
a = rd.uniform(1+5j,1+1j)
print(a)
a = rd.uniform(1+5j,1+5j)
print(a)
复制代码
4.328510673589862
(1+2.2475224962081475j)
(1+5j)
复制代码