如何为布尔数组赋值并计算N次抛硬币实验的求和结果
解决硬币抛掷求和问题的几种方法
嘿,我明白你的困扰啦!你已经成功用rand(N).<p得到了区分正反的布尔数组,现在就差把这些true/false转换成对应的-1/2和1/2然后求和对吧?下面给你几种简单直接的实现方式:
方法1:用条件映射直观赋值(推荐)
不管你用的是NumPy还是纯Python,条件赋值都是最容易理解的方式:
- 如果用NumPy(看起来你大概率是用这个,因为
rand(N)是NumPy的常用写法):import numpy as np N = 100 # 替换成你的抛掷次数 p = 0.5 # 公平硬币的反面概率 # 生成布尔数组:true=反面,false=正面 coin_flips = np.random.rand(N) < p # 映射为对应的值:反面→-1/2,正面→1/2 values = np.where(coin_flips, -0.5, 0.5) # 计算总和 total_sum = values.sum() - 如果用纯Python:
import random N = 100 p = 0.5 coin_flips = [random.random() < p for _ in range(N)] values = [-0.5 if flip else 0.5 for flip in coin_flips] total_sum = sum(values)
方法2:利用布尔值的数值特性做线性变换
在编程里,true会被当作1,false当作0,我们可以用这个特性做个简洁的数学转换:
要让反面(true=1)对应-1/2,正面(false=0)对应1/2,可以直接用公式x = 0.5 - flip计算每个值,再求和:
# NumPy版本 total_sum = (0.5 - coin_flips).sum() # 纯Python版本 total_sum = sum(0.5 - flip for flip in coin_flips)
这个方法不用额外生成中间数组,效率更高,代码也更简洁~
你可以试试这两种方法,随便哪种都能完美得到你想要的总和!
内容的提问来源于stack exchange,提问作者JakobOOlsson
相关产品推荐
相关产品推荐

