1。概念1.1真随机数和伪随机数大多数计算机语言都提供API来生成随机数。此类API称为随机数生成器。计算机可以使用随机数来模拟现实世界中的各种随机概率问题。没有随机生成器的编程语言不是“好语言”。什么是真随机数?现实世界中的随机数:像掷硬币、骰子、转轮、使用电子元件的噪音、核裂变等。计算机通过硬件技术模拟现实世界中这种物理现象产生的随机数,我们称之为真随机数字。这样的随机数发生器称为物理随机数发生器。产生真随机数对计算机硬件技术要求很高。真随机数的特点:不可预测。就像抛硬币一样,您无法真正预测硬币接下来会朝向哪一面。什么是伪随机数?通过算法模拟产生的随机数称为伪随机数。计算机编程语言产生的随机数基本上都是伪随机数。伪随机数的特点:由于是通过算法模拟出来的,虽然短期内是不可预测的,但较长时期内的随机数是可以预测的。1.2随机数种子生成伪随机数时,需要设置一个随机种子。种子的作用是在随机数生成算法中注入一个动态变量。例如,使用系统当前时间作为随机种子,随机算法可以根据时间的变化产生随机性更大的随机数。但是,如果不是在毫秒级生成随机数,那么在同一时间点生成的大量随机数可能是相等的。选择种子时,可以考虑综合多维变化值进行计算。比如在UNIX系统中,系统时间、WIFI连接、甚至键盘按下次数都被量化为种子。参考指标越多,伪随机数就越接近真正的随机生成。2.Pythonrandom模块random模块实现了各种分布的伪随机数生成器。因为它是完全确定的,所以它不适合所有用途,而且完全不适合加密用途。出于安全目的,不应使用此模块的伪随机生成器。出于安全或加密目的,请使用Python中的secrets模块。这使得之前导入random模块importrandom2.1randommodule是必要的。初始化随机种子random.seed(a=None,version=2)如果省略a或None,则使用当前系统时间作为随机种子。如果操作系统提供随机源,则使用它们代替系统时间。如果a是int类型,则直接使用。当设置随机种子为常量时,随机数每次都是固定的。importrandom#设置随机种子是一个int常量random.seed(10)print(random.random())#设置随机种子是一个int常量random.seed(10)print(random.random())#设置随机种子它是一个整数常量random.seed(10)print(random.random())输出:0.57140259468991350.57140259468991350.5714025946899135从一系列数字中生成随机数random.randrange(start,stop[,step])fromrange(start,stop,step)返回一个随机选择的元素。这等效于choice(range(start,stop,step)),但实际上并不构建范围对象。返回一个随机整数random.randint(a,b)等价于randrange(a,b+1)导致N使得a<=N<=b从非空序列seq返回一个随机元素。如果seq为null,则引发IndexError。random.choice(seq)importrandomlst=[5,3,90,12,4,6]r=random.choice(lst)print(r)每次运行都会从列表中随机获取一个数字。随机打乱序列x。random.shuffle(x[,random])可选参数random是一个无参数函数,返回[0.0,1.0]范围内的随机浮点数;默认情况下这是函数random()importrandomlst=[5.0,3.0,90.0,12.0,4.0,6.0]#使用random.random函数random.shuffle(lst,random.random)print(lst)#输出结果[3.0,90.0,6.0,12.0,5.0,4.0]#------------------------------------defmy_random():returnfloat(random.randint(0,1))lst=[5.0,3.0,90.0,12.0,4.0,6.0]#使用自定义函数random.shuffle(lst,my_random)print(lst)返回从整个序列或集合中选择的唯一元素的k长度列表。对于没有复制的随机抽样。random.sample(population,k,*,counts=None)返回[0.0,1.0]范围内的下一个随机浮点数。random.random()返回随机浮点数Nrandom.uniform(a,b)根据等式a+(b-a)*random()中的浮点舍入,端点b可能包含也可能不包含在范围。结果N满足:当a<=b时a<=N<=b,当b
