题目 随机抽取颜色球
编写一个函数来模拟从罐子中抽取球的过程。球的颜色存储在名为jar
的列表中,每个颜色对应球的数量存储在名为n_balls
的列表中,且数量与颜色列表的索引对应。
示例:
输入:
jar = ['green', 'red', 'blue']
n_balls = [1, 10, 2]
# 1个绿色球
# 10个红色球
# 和2个蓝色球
输出
sample_multinomial(jar, n_balls) -> "blue"
函数执行后应随机返回罐中某个颜色的球,抽取的概率与每种颜色球的数量成正比。在示例中,因为红色球数量最多,所以抽到红色球的概率最高,但也有可能抽到绿色或蓝色球。
答案
答案代码
import random
def sample_multinomial(jar, n_balls):
# 根据n_balls计算每个颜色的权重
weights = [count / sum(n_balls) for count in n_balls]
# 使用random.choices按权重随机选择一个颜色
chosen_color = random.choices(jar, weights=weights, k=1)[0]
return chosen_color
上面这个函数使用random.choices
函数来模拟从罐子中抽取球的过程,其中每个颜色被选中的概率与其在n_balls
列表中的计数成正比。
在这段代码中,我们首先计算了每个颜色被选中的权重,通过将每个颜色的球数除以总球数来得到。然后,我们使用random.choices
函数,它根据提供的权重列表随机选择元素。k=1
参数表示我们只想抽取一个球。函数返回抽取到的球的颜色。
每次运行这段代码时,你都会得到一个随机抽取的颜色,抽取的概率与n_balls
列表中的计数成正比。
random.choices()函数介绍
random.choices()
是Python标准库中的一个函数,用于从一个给定的集合中随机选择元素。
其中,
population
是需要从中选择元素的集合,可以是列表、元组、字符串等。weights
是一个可选参数,用于指定每个元素的选择权重,如果不提供,则默认所有元素具有相同的权重。k
是一个整数,表示需要选择的元素数量,默认为1。
以下是一些使用random.choices()
的例子:
import random
# 创建列表jar
jar=[1,2,3,4,5]
# 随机选择5个元素,每个元素被选中的概率相等。
print(random.choices(jar, k=5))
# 随机选择5个元素,但只有数字3有被选中的权重,因此结果中只会包含数字3。
print(random.choices(jar, weights=[0,0,1,0,0], k=5))
#使用累积权重来确定每个元素被选中的概率。
print(random.choices(jar, cum_weights=[1,1,1,1,1], k=5))
总的来说,random.choices()
是一个非常灵活的函数,可以根据需要调整选择元素的权重,非常适合于需要根据概率分布进行随机选择的情况。
除了random.choices()
,还有另外两个类似的函数——random.choice()
和 random.sample()
random.choice()
random.choice()
函数用于从非空序列(如列表、元组或字符串)中随机选择一个元素。它假设所有元素被选中的概率是相同的,并且每次调用只返回一个元素。如果序列为空,random.choice()
会抛出一个 IndexError
异常。
示例:
import random
colors = ['red', 'green', 'blue']
chosen_color = random.choice(colors)
print(chosen_color) # 输出可能是 'red'、'green' 或 'blue' 中的一个
random.sample()
random.sample()
函数用于从序列中随机选择多个不重复的元素。它需要两个参数:一个序列和一个整数 k,表示要选择的元素数量。返回的是一个新列表,其中包含从原始序列中随机选择的不重复的 k 个元素。如果序列中的元素数量少于 k,random.sample()
会抛出一个 ValueError
异常。
示例:
import random
numbers = [1, 2, 3, 4, 5, 6]
sampled_numbers = random.sample(numbers, 3)
print(sampled_numbers)
# 输出可能是 [1, 3, 5]、[2, 4, 6] 等包含三个不重复数字的列表
总结一下它们之间的主要区别:
- 返回值的数量和类型:
random.choice()
返回一个随机选择的元素,而random.sample()
返回一个包含多个随机选择元素的列表。 - 是否允许重复:
random.choice()
允许在多次调用中重复选择相同的元素,而random.sample()
确保所选元素在返回的列表中不重复。 - 错误处理:当序列为空时,
random.choice()
会抛出IndexError
,而random.sample()
在请求的样本大小超过序列长度时会抛出ValueError
。 - 使用场景:当你只需要一个随机元素时,使用
random.choice()
;当你需要多个不重复的随机元素时,使用random.sample()
。
其他常用Random函数汇总
常用的函数有以下几种:
- 生成随机浮点数:
random.random()
:返回一个范围在[0,1)内的随机浮点数。
random.uniform(a, b)
:返回一个范围在[a, b)内的随机浮点数。 - 生成随机整数:
random.randint(a, b)
:返回一个范围在[a, b)内的随机整数,包含a和b的整数部分。
random.randrange(a, b, step)
:从指定的范围内,按照给定的基数和步长值获取一个随机数值。 - 生成正态分布的随机数:
random.normalvariate(mean, stddev)
:返回满足指定均值(mean)和标准差(stddev)的正态分布(高斯分布)的概率密度随机数。 - 从序列中选择元素:
random.choice(seq)
:从非空序列中随机选择一个元素。
random.sample(seq, k)
:从给定的总体序列或集合中随机选取k个唯一的元素。 - 打乱序列:
random.shuffle(x)
:将序列x中的元素打乱,随机排序。 - 设置随机种子:
random.seed([x])
:初始化伪随机数生成器的种子值;如果未传入参数,则使用系统当前时间作为种子。