在网上看到字节有一个关于概率的面试题。题目为,将一个绳子随机剪成三段,这三段能够组成一个三角形的概率,并用你熟悉的代码实现。
这本质上是一个数学题,假设绳长为1,绳长不为1可以等比例取之。想要三段绳子长度能组成三角形,就是要三条边长a.b.c满足a>0,b>0,c>0,且a+b>c,b+c>a,a+c>b,a+b+c=1。通过计算这几个不等式可知,其必要条件是a<1/2,b<1/2,c<1/2,也就是三条边最大长度都小于1/2。
所以我们可以这样编程,随机取两个0到1之间的小数,因为随机取的两个数相等的情况为零,所以不用判断其相等的情况。这两个数就相当于绳子的两个断点到一个端点的长度与绳长的比例。然后判断三条绳长的最大值小于1/2,即可将计数器加1。具体编程如下。
# 将一根绳子随机割成三段,求这三段可以拼成三角形的概率
import random
def rope_triangle():
# 随机的次数
n = 100000
# 可以组成三角形的次数
triangle_times = 0
for i in range(n):
# 随机取两个小数,这两个数为取整根绳长的比例,因为取的是小数,这两个数相等的概率为0,所以不用判断两数一样的情况
random_a = random.random()
random_b = random.random()
print(random_a, random_b)
# 判断最大值最小值,用于取三个绳长的长度
max_ = max(random_a, random_b)
min_ = min(random_a, random_b)
# 取三段绳长分别为0到最小的数之间长度为第一段绳长,最小数到最大数中间长度为第二段绳长,最大数到1之间的长度为第三段绳长
segment_a = min_
segment_b = max_ - min_
segment_c = 1 - max_
# 容易判断,当这三段长度的最大值小于0.5时,可以组成三角形
if max(segment_a, segment_b, segment_c) < 0.5:
triangle_times += 1
# 计算概率
print(triangle_times / n)
if __name__ == '__main__':
rope_triangle()