预备备
首先使用random函数之前需要先导入random模块
import random
random.random()
random.random()不需要参数,会生成0-1之间的随机数,生成的随机数小数点后位数在15-18位之间,我运行了几次暂时没有看到不在这个区间的。
for i in range(10):
a = random.random() # 重点标记
print(a, end=' ')
print(len(str(a)[2:])) # 计算生成的随机数是小数点后有多少位
运行结果:
0.27335015371074467 17
0.5623481596080516 16
0.016844202005072417 18
0.7528070130456832 16
0.7407135450665351 16
0.45346895355857786 17
0.861146208501261 15
0.17156667452663998 17
0.5892867120392307 16
0.40453104035795007 17
random.randint(int, int)
random.randint()需要两个int类型的参数,形成一个区间,生成的随机数为这个区间内的整数,既包含第一个参数,也包含第二个参数。
for i in range(10):
print(random.randint(0, 9), end=' ')
运行结果:
5 8 8 4 5 8 5 0 6 9
参数可以是负值
for i in range(10):
print(random.randint(-5, 1), end=' ')
运行结果:
-4 0 -5 -1 -5 1 -4 -5 -3 -2
但前一个参数不能大于后一个参数,否则会报错(可以等于)
for i in range(10):
print(random.randint(5, 1), end=' ')
Traceback (most recent call last): File
“E:\ReRAM_ReWrite\multithreading\one-dim.py”, line 8, in
print(random.randint(5, 1), end=’ ') File “C:\Users\11265\AppData\Local\Programs\Python\Python39\lib\random.py”,
line 339, in randint
return self.randrange(a, b+1) File “C:\Users\11265\AppData\Local\Programs\Python\Python39\lib\random.py”,
line 317, in randrange
raise ValueError(“empty range for randrange() (%d, %d, %d)” % (istart, istop, width)) ValueError: empty range for randrange() (5, 2,
-3)
根据他的返回函数也可以看出来生成的随机数既包含第一个参数,也包含第二个参数。
random.seed(a)
当你在random函数之前先设置random.seed(a)时,random函数会根据你所给的seed参数的hash值产生一个随机数,参数a可以是None, int, float, str, bytes, and bytearray 等类型,只要是可以hash的类型都可以.
只要你random.seed中的参数不变,它的hash值就不变,产生的随机数就不变,就算是两个不同的程序seed里用了同一个参数并用相同的随机函数,产生的随机数也是一样的,用法如下:
for j in range(5):
random.seed(1)
print(random.randint(0, 9), end=' ')
random.seed(2)
print(random.randint(0, 9), end=' ')
print('end') # 多写了一个print是为了换行
运行结果:
2 0 end
2 0 end
2 0 end
2 0 end
2 0 end
把第一个seed参数改成5,第二个不变
for j in range(5):
random.seed(5)
print(random.randint(0, 9), end=' ')
random.seed(2)
print(random.randint(0, 9), end=' ')
print('end')
实验结果:
9 0 end
9 0 end
9 0 end
9 0 end
9 0 end
可以看到seed参数为2时和前面一个程序产生的seed为2 的随机数相同都是0
另外random.seed后面跟的也可以是random.random()等函数。
当我知道seed是基于hash值的时候,我去百度了Python 中什么数据类型可以hash,上面写着不可变数据类型都可以,所以说元组也是可以的,然后我试了一下
t = (1, 4, 5)
for j in range(5):
random.seed(t)
print(random.randint(0, 9), end=' ')
random.seed(2)
7 7 7 7 7
DeprecationWarning: Seeding based on hashing is deprecated since Python 3.9 and will be
removed in a subsequent version. The only supported seed types are: None, int, float, str,
bytes, and bytearray.
random.seed(t)
元组确实可以,但同时也给出了警告,基于hash的seed自Python 3.9起已弃用,并将在后续版本中移除。
random还有很多有趣的函数啊,有时间我再接着写。