random库简析

python random库的用法简析

我们在密码学中提到过随机数和伪随机数发生器的概念。

随机数在公钥密码体制中有着广泛的应用。例如使用随机数作为公钥密码算法中的密钥,RSA加密和数字签名的素数,DES的密钥等。

random模块为我们提供了一个方便且快速的伪随机数发生器。

 

1.random函数

返回一个落在[0,1)范围内的随机浮点值。

2.uniform函数

返回指定区间[a,b]内的一个随机值。

3.randint函数

返回闭区间[a,b]的一个随机整数值。

4.randrange函数

除了开始值和结束值,还有一个步长值。等价于从range(start,stop,step)中选择一个随机值返回。

该函数更加高效,因为它没有真正构造一个区间。

for i in range(5):
    x=rd.random()
    print(x)
    
'''
0.6330991939020664
0.8830984197895451
0.8244798733795524
0.7175085341098889
0.010479617950157616
'''

for i in range(5):
    x=rd.uniform(5,10)
    print(x)

'''
5.123263387529127
9.971978038032656
9.26300088246108
7.740537789455242
8.84881415728859
'''

for x in range(5):
    print(rd.randint(1,100),end=' ')
    
'''
for x in range(5):
    print(rd.randint(1,100),end=' ')
'''

for x in range(5):
    print(rd.randrange(0,100,5),end=' ')
    
'''
10 5 95 5 25 
'''

 

5.随机选择元素

rd.choice()函数,从一个类数组序列中随机选择元素

#一个简单的抛硬币程序
A={'a':0,'b':0}
B=['a','b']
for x in range(50000):
   A[rd.choice(B)]+=1
print(A)

'''
{'a': 24799, 'b': 25201}
'''

 

6.排列

rd.shuffle()函数,返回一个可变类型的排列。

A=list(range(16))
for i in range(4):
    rd.shuffle(A)
    print(A)
    
'''
[13, 14, 1, 2, 10, 9, 0, 8, 5, 15, 12, 3, 4, 7, 6, 11]
[9, 11, 2, 7, 14, 1, 15, 6, 5, 13, 0, 8, 12, 4, 3, 10]
[4, 10, 1, 5, 7, 15, 9, 0, 2, 3, 14, 6, 8, 13, 11, 12]
[11, 13, 7, 0, 14, 10, 2, 12, 8, 5, 4, 6, 15, 3, 9, 1]
'''

 

7.采样

rd.sample()函数,从输入数据中返回一个随机无重复值样本,且不会修改输入序列。

with open(r'C:\Users\zzy\PycharmProjects\pythonProject\x.txt','rt') as f:
    words=f.readlines()
words=[w.rstrip() for w in words]
print(rd.sample(words,5))

'''
['smile', 'cat', 'say', 'apple', 'dragon']
'''

x=rd.sample(range(1000),50)
print(x)

'''
[936, 233, 607, 837, 606, 408, 566, 2, 383, 222, 774, 578, 554, 820, 811, 74, 253, 43, 911, 592, 322, 906, 626, 641, 609, 428, 75, 601, 378, 102, 882, 555, 523, 41, 977, 827, 677, 119, 628, 573, 965, 652, 236, 14, 510, 672, 973, 591, 347, 670]

'''

 

8.种子

rd.seed()函数,用来初始化伪随机数发生器,因为公式是确定的,产生的序列也将是确定的。

for x in range(10):#重复十次
    rd.seed(5)#设定种子
    print(rd.random())
    
'''
0.6229016948897019
0.6229016948897019
0.6229016948897019
0.6229016948897019
0.6229016948897019
0.6229016948897019
0.6229016948897019
0.6229016948897019
0.6229016948897019
0.6229016948897019
'''

for x in range(3):#重复三次
    rd.seed(5)#设定种子
    for i in range(5):#生成五个随机值
        print('{:4.3f}'.format(rd.random()),end=' ')
    print('\n')
    
'''
0.623 0.742 0.795 0.942 0.740 

0.623 0.742 0.795 0.942 0.740 

0.623 0.742 0.795 0.942 0.740 
'''

def fun(n,s=5):
    rd.seed(s)
    x=[]
    for i in range(n):
        x.append(rd.randint(1,1000))
    return x
print(fun(10,5))
print(fun(10,5))
a=fun(10000,5)
b=fun(10000,5)
print(a == b)

'''
[638, 262, 760, 368, 815, 708, 966, 862, 758, 668]
[638, 262, 760, 368, 815, 708, 966, 862, 758, 668]
True

'''
#可以看出,这个伪随机数发生器的周期是非常大的

 

posted @ 2021-08-12 11:02  zeroy610  阅读(355)  评论(0编辑  收藏  举报