一、random库介绍

random模块就像是一个魔法师,它能够以各种分布的伪随机数的形式,为我们提供看似随机的数字。但是,这些数字其实是经过算法和种子的精心构造,所以我们称之为"伪随机数"。就好像是魔术师用一套特殊的技巧和道具,制造出了一系列令人惊叹的魔术效果一样。

这里的"种子"就像是魔术师的秘密道具,它是生成随机数的基准。最常用的种子就是时间戳,就好像魔术师使用的道具不同,魔术效果也会有所不同。但是,一旦算法和种子确定,那么生成的随机数序列也就确定了,就像魔术师的魔术效果一样,不会有任何变化。

所以,虽然这些数字看起来像是随机的,但实际上它们是按照一定的规律生成的。就像魔术师的魔术一样,看似神奇,但背后都有一套精密的操作方法。所以,我们称之为"伪随机数",既有随机的外表,又有确定的内在。

import random

二、常用函数

random.seed(a)

这个函数就像是给随机数生成器一个"种子",让它能够产生相同的随机数序列。你可以把它想象成是给一颗树一个特殊的肥料,让它长出一模一样的树枝和叶子。参数a可以是整数或浮点数,如果不设置,默认会使用系统时间作为种子。所以,如果你想要得到相同的随机数序列,记得使用相同的种子哦!就像是要种出一样的花朵,得用同样的肥料!

import random

print("没有设定种子时")
for i in range(5):
    ret = random.randint(1, 10)
    print(ret, end=" ")
print()

print("设定种子时")
random.seed(1)
for i in range(5):
    ret = random.randint(1, 10)
    print(ret, end=" ")

输出结果:

如上图可以看出:没有显式设定种子时,每次输出的随机数都是不一样的;显式设定种子时,每次输出的随机数都是一样的

random.random()

这个小伙子就像是一个魔术师,每次都能从帽子里变出一个0.0到1.0之间的随机浮点数。你永远不知道他会变出什么数字,就像你永远不知道下一秒会发生什么。所以,准备好迎接这个魔术般的随机数吧!

>>> import random
>>> random.random()
0.9279749775408933
>>> random.random()
0.12720379394341363
>>> random.random()
0.9391670189485866

random.uniform(a,b)

这个函数就像是一个魔术师,可以帮你生成一个范围在[a,b]之间的随机小数。不管你是想要整数还是浮点数,它都能满足你的需求。

想象一下,你正在玩一个数字游戏,你需要随机选择一个数字,但是你又不想太随意,想要在一个特定的范围内选择。这时候,random.uniform(a,b)就像是一个魔法盒子,你只需要告诉它你想要的范围,它就会帮你生成一个随机的数字。

不管是生成一个随机的体重范围,还是一个随机的温度范围,random.uniform(a,b)都可以胜任。它就像是一个无所不能的魔术师,总能帮你找到你想要的数字。

所以,记住,当你需要在一个范围内生成一个随机小数的时候,不要犹豫,召唤random.uniform(a,b)吧!它会帮你解决难题,让你的代码更加有趣和生动!

>>> import random
>>> random.uniform(10.0, 20.0)
10.839441969258752
>>> random.uniform(10.0, 20.0)
12.233491150445115
>>> random.uniform(10, 20)
11.290566243261305

random.randint(a,b)

这个函数就像是一个魔术师,它可以在你的指令下,从帽子里抽出一个[a,b]之间的随机整数!不管是抽奖还是游戏,它都能帮你搞定!就像是一把神奇的魔杖,让你随心所欲地生成随机数字!快来试试吧,让这个函数为你带来意想不到的惊喜!

>>> import random
>>> random.randint(10,100)
100
>>> random.randint(10,100)
83
>>> random.randint(10,100)
66

random.randrange(start, stop, [step])

这个函数就像是一个有趣的数学游戏!它可以帮助你生成一个位于 [start, stop) 范围内的随机整数而且你还可以指定一个步数来控制它的变化规律。就像是在数学课上,你可以从一个数字跳到另一个数字,而且还可以控制每次跳跃的大小。

让我们来看看这个函数的规则吧:start 是你的起点,stop 是你的终点(不包含在内)。而 step 则是你每次跳跃的大小。如果你不指定 step,那么默认就是每次跳跃一个单位。

举个例子吧!假设你要在 [1, 10) 范围内生成一个随机整数,而且每次跳跃的大小是2。那么你可以使用 random.randrange(1, 10, 2) 这个函数来完成任务。它会帮你随机选择一个起点,然后每次跳跃2个单位,直到达到终点之前。

这个函数就像是一个神奇的数学游戏,让你可以在指定范围内随机选择一个整数,并且还可以控制每次变化的大小。快来试试吧!

随机生成1-100的整数:

>>> import random
>>> random.randrange(1,100)
54
>>> random.randrange(1,100)
21
>>> random.randrange(1,100)
71

随机生成1-100的奇数:

>>> import random
>>> random.randrange(1,100,2)
37
>>> random.randrange(1,100,2)
63
>>> random.randrange(1,100,2)
29

随机生成1-100的偶数:

>>> import random
>>> random.randrange(2,100,2)
62
>>> random.randrange(2,100,2)
6
>>> random.randrange(2,100,2)
46

random.getrandbits(k)

这个函数就像是一个魔术师,可以在内存中制造出一个有着k位长度的随机整数。它就像是一个黑盒子,你只需要告诉它你想要多少位的整数,它就会立即为你创造出来。不过要记住,k必须是一个整数值哦,不然魔术师可是不会听你的话的!

>>> import random
>>> random.getrandbits(10)
29
>>> random.getrandbits(10)
540
>>> random.getrandbits(10)
227

random.choice(seq)

这个函数就像是一个魔术师,它从序列类型seq中随机返回一个元素!可以放各种各样的东西,比如字符串、列表、元组等等。你只需要告诉魔术师你的箱子是什么类型的,它就会随机抽出一个元素给你。不管你的箱子里是什么,这个魔术师都能给你一个惊喜!

在Python的世界里,这个函数就像是一个神奇的抽奖机,你把各种各样的东西放进去,然后它会随机抽出一个给你。无论你放进去的是什么,它都能给你一个意外的惊喜!记住,这个函数只能从序列类型中进行抽选,所以你的箱子一定要是一个序列类型,比如字符串、列表或者元组。让我们来试试这个抽奖机,看看它会给我们带来什么样的惊喜吧!

>>> import random
>>> list = ['a', 'b', 'c', 'd', 'f', 'g']
>>> random.choice(list)
'b'
>>> random.choice(list)
'f'
>>> random.choice(list)
'g'

random.shuffle(seq)

将序列类型中元素随机排序,返回打乱后序列,seq被改变(改变原列表),shuffle为洗牌之意; seq取序列类型:如字符串,列表,元组

这个函数就像是给你的序列类型进行了一场疯狂的派对!它会随机地改变序列中元素的排列顺序,就像是把你的列表、字符串或元组放入了一个摇晃的魔术帽中,然后随机地抽取出来。当你调用这个函数时,你的序列会变得一团糟,就像是洗牌后的扑克牌一样!记住,这个函数会直接改变原始的序列,所以请小心使用哦!

>>> import random
>>> list = ['a', 'b', 'c', 'd', 'f', 'g']
>>> random.shuffle(list)
>>> list
['c', 'a', 'f', 'd', 'g', 'b']
>>> random.shuffle(list)
>>> list
['f', 'a', 'b', 'c', 'g', 'd']
>>> random.shuffle(list)
>>> list
['a', 'd', 'g', 'c', 'b', 'f']

random.sample(pop,k)

这个函数就像是一个神奇的抽奖箱,你可以把一堆东西放进去,然后它会帮你随机选出一些东西,而且还能保证不改变原来的顺序你只需要告诉它你想要选取多少个东西,它就会帮你完成任务。

比如说,你有一个装满了各种美食的篮子,里面有苹果、香蕉、橙子、葡萄等等。你想要随机选取3种水果,但是又不想打乱篮子里的顺序。这时候,你就可以使用random.sample(pop, k)函数啦!它会帮你从篮子里随机选取3种水果,并且返回一个新的列表,里面包含了你选中的水果,而篮子里的水果顺序还是原样不变的。

记住,pop是你放进抽奖箱的东西,可以是一个列表、元组或者其他序列类型。而k则是你想要选取的东西的个数,必须是一个整数。

所以,如果你想要在保持原有顺序的情况下,从一个序列中随机选取一些元素,那就赶快使用random.sample(pop, k)函数吧!它会让你的代码更加有趣和生动!

>>> import random
>>> list = ['a', 'b', 'c', 'd', 'f', 'g']
>>> random.sample(list, 4)
['b', 'f', 'c', 'a']
>>> random.sample(list, 4)
['g', 'f', 'b', 'd']
>>> random.sample(list, 4)
['g', 'f', 'c', 'b']

三、不常用函数

random.getstate()

这个函数就像是生成器的备份小助手,它可以捕获并返回生成器当前的内部状态。你可以把这个状态对象传递给setstate()函数,就像是把备份还原回去一样,让生成器回到调用getstate()函数之前的状态。

random.setstate(state)

这个函数就像是生成器的还原小魔术师,它接受一个状态对象state,用来把生成器的内部状态恢复到之前的状态。就像是把魔术师的表演还原回去一样,让生成器回到之前的状态。

random.betavariate(alpha, beta)

这个函数就像是一个魔法师,它根据参数alphabeta来表演一个神奇的Beta分布。返回值范围在0和1之间,就像是魔法师的魔法只能在舞台上发生一样。

random.expovariate(lambd)

这个函数就像是一个时间旅行者,它遵循指数分布的规律。参数lambd决定了时间旅行的速度,就像是时间旅行者的能力值一样。

random.gammavariate(alpha, beta)

这个函数就像是一个金牌运动员,它遵循Gamma分布的规律。参数alphabeta就像是运动员的训练成绩和技能等级一样,决定了他们的表现。

random.gauss(mu, sigma)

这个函数就像是一个天气预报员,它根据平均值mu和标准差sigma来预测高斯分布的结果。就像是天气预报员根据历史数据来预测未来的天气一样。

random.normalvariate(mu, sigma)

这个函数就像是一个身高测量仪,它根据平均值mu和标准差sigma来测量正态分布的结果。就像是身高测量仪根据统计数据来测量人们的身高一样。

random.paretovariate(alpha)

这个函数就像是一个奖品分发器,它根据形状参数alpha来分发帕累托分布的奖品。就像是奖品分发器根据不同的形状参数来分发不同类型的奖品一样。

random.weibullvariate(alpha,beta)

这个函数就像是一个生命力测试仪,它根据比例参数alpha和形状参数beta来测试威布尔分布的生命力。就像是生命力测试仪根据不同的参数来测试不同物种的生命力一样。

四、真实案例

随机密码字符串

这个字符串会包含数字和字母,而且你还可以指定密码的位数哦!

首先,我们需要使用 Python 中的 random 模块来生成随机字符。然后,我们可以使用 string 模块中的 digitsascii_letters 来获取数字和字母。

下面是一个简单的代码示例,让我们一起来看看吧:

import random
import string

def generate_password(length):
    characters = string.digits + string.ascii_letters
    password = ''.join(random.choice(characters) for _ in range(length))
    return password

# 指定密码位数为 8
password = generate_password(8)
print("你的随机密码是:" + password)

这段代码首先定义了一个 generate_password 函数,它接受一个参数 length,表示密码的位数。在函数内部,我们将数字和字母合并到 characters 变量中,并使用 random.choice 函数随机选择字符,重复 length 次,然后使用 join 方法将这些字符连接起来,得到最终的密码。

最后,我们调用 generate_password 函数并传入位数为 8,将生成的密码赋值给 password 变量,并打印出来。

现在,你可以运行这段代码,获得一个随机的、包含数字和字母的密码字符串啦!记得保管好哦,不要让别人知道哦!😉

示例二:

import random
import string


def get_random_string(length):
    # 随机生成字母和数字的位数
    num_count = random.randint(1, length - 1)
    letter_count = length - num_count

    # 随机抽样生成数字序列
    num_list = [random.choice(string.digits) for _ in range(num_count)]

    # 随机抽样生成字母序列
    letter_list = [random.choice(string.ascii_letters) for _ in range(letter_count)]

    # 合并字母和数字
    all_list = num_list + letter_list

    # 乱序
    random.shuffle(all_list)

    result = "".join([i for i in all_list])
    return result


# 生成10位的密码
password1 = get_random_string(10)
print(password1)
# 生成15位的密码
password2 = get_random_string(15)
print(password2)
# 生成20位的密码
password3 = get_random_string(20)
print(password3)

输出结果:

41eD76F3e1
915087432k8443z
002L5292840A07284755

计算圆周率

1)圆周率的近似计算公式:

pi = 0
N = 100
for k in range(N):
    pi += 1 / pow(16, k) * (4 / (8 * k + 1) - 2 / (8 * k + 4) - 1 / (8 * k + 5) - 1 / (8 * k + 6))
print("圆周率值是:%s" % pi)

输出结果:

圆周率值是: 3.141592653589793

2)蒙特卡洛算法:

蒙特卡洛算法(Monte Carlo algorithm)是一种基于随机采样和统计分析的计算方法,常用于解决概率统计和数值计算问题。它的核心思想是通过模拟随机事件来估计问题的解。

蒙特卡洛算法的步骤如下:

  1. 定义问题:明确要解决的问题,确定问题的数学模型和计算目标。

  2. 生成随机样本:根据问题的特点和要求,生成符合特定分布的随机样本。常见的随机数生成方法包括均匀分布、正态分布等。

  3. 计算函数值:对每个随机样本,根据问题的数学模型计算相应的函数值。

  4. 统计分析:根据生成的随机样本和对应的函数值,进行统计分析。常见的分析方法包括计算均值、方差、概率分布等。

  5. 得出结论:根据统计分析的结果,得出问题的近似解或概率估计。

蒙特卡洛算法的优点是简单易用,适用范围广,能够处理复杂的数值计算和概率统计问题。它不依赖于问题的具体形式,只需要根据问题要求生成随机样本并进行统计分析即可。然而,蒙特卡洛算法的缺点是计算精度和计算速度方面的限制。为了获得更高的精度,通常需要增加样本数量,这会带来更大的计算开销。

import random

DARTS = 1000 * 1000 * 10
hits = 0.0

for i in range(1, DARTS + 1):
    x, y = random.random(), random.random()
    dist = pow(x ** 2 + y ** 2, 0.5)
    if dist <= 1.0:
        hits = hits + 1
pi = 4 * (hits / DARTS)
print("圆周率值是:%s" % pi)

输出结果:

圆周率值是:3.14205