这是我在下班路上想到的问题. 因为看见路边的车上会有鸟屎, 就想, 运动的汽车和停下的汽车, 被鸟拉屎的概率一样不一样呢?
如果车停在树下, 而树上比天上更容易产生鸟的话, 那树下的车被鸟拉屎的概率可能更高些(但是也不一定呀, 因为车一直在运动, 经过一些地方的时候, 这些地点上方的鸟可能会很多, 导致路途上平均的鸟的数量更多). 不过当时我也没想到很好的数学证明的方法, 因为车运动的情况比较复杂了, 当时没想清楚运动的概率应该怎么算.
这东西代码模拟不算复杂, 所以, 就假设, 运动的车和静止的车是在同一条大马路上, 然后运动的车是在马路上做往复运动, 车的运动是匀速且离散的(物理上也确实是离散的, 不过我们先在数学上假设是离散的), 也就是说, 每一个单位时间观察, 车总是在整数倍的单位长度的位置上, 最重要的是假设每个单位长度上, 鸟拉屎的概率相同. (写道这里仔细想想, 这时候运动的车和静止的车被鸟拉屎的概率应该是一样的, 不过当时我没想清楚, 所以这里还是把过程贴上来吧~)
以下是定义的一些状态, 如路的长度, 鸟拉屎的概率, 车的长度等等:
1
2
3
4
5
6
7
8
9
10
| road_length = 100 ## 路的长度
shit_rate = 0.3 ## 鸟拉屎的概率
shit_pos = [p for p in range(0, road_length)] ## 路上可能出现鸟屎的位置, 假设等概率
car_length = 4 ## 车的长度
car_speed = 1 ## 车的速度
car_start = 0 ## 运动的车开始的位置
static_car = 0 ## 对照组, 静止的车的位置
sim_times = 100000000 ## 模拟时长
static_count = 0 ## 对照组, 静止的车被鸟拉屎的次数
move_count = 0 ## 运动的车被鸟拉屎的次数
|
现在要生成一个鸟拉屎的位置, 我们先判断会不会有鸟拉屎, 然后在给它安排一个随机的位置:
1
2
3
4
5
6
| ## 生成一个鸟拉屎的位置, 如果这个时间点没有鸟拉屎, 则输出-1(假设拉在了别的地方)
import random
def generate_shit(shit_rate, shit_pos):
should_shit = random.random() < shit_rate
shit_position = -1 if not should_shit else shit_pos[random.randrange(len(shit_pos))]
return shit_position
|
车是往复运动的, 所以到了道路末尾又得掉头, 这里我们就理想化了, 假设车的速度可以直接反转:
1
2
3
4
5
6
7
8
9
10
| ## 车的运动函数, 如果车运动到了路的末尾, 则又从末尾向头运动, 假设匀速
direction = car_speed
def move_car(car_start, car_length, road_length):
global direction
if (car_start + car_length) >= road_length:
direction = -car_speed
if car_start <= 0:
direction = car_speed
car_start = car_start + direction
return car_start
|
根据鸟拉屎的位置, 以及车的长度, 判断鸟屎有没有拉在车上:
1
2
3
4
| ## 判断鸟屎是否拉在了车上
def hashit_car(car_start, car_length, shit_position):
hashit = 1 if (car_start <= shit_position and shit_position < (car_start + car_length)) else 0
return hashit
|
开始模拟, 我这里的数据是模拟一亿次:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| for _ in range(sim_times):
shit_position = generate_shit(shit_rate, shit_pos)
car_start = move_car(car_start, car_length, road_length)
has_static_shit = hashit_car(static_car, car_length, shit_position)
has_move_shit = hashit_car(car_start, car_length, shit_position)
static_count = static_count + has_static_shit
move_count = move_count + has_move_shit
# print(shit_position, static_car, has_static_shit, static_count, car_start, has_move_shit, move_count)
print(static_count, move_count, sim_times)
print(static_count / sim_times, move_count / sim_times)
|
得到静止车和运动车被鸟拉屎的概率几乎相同, 为0.012, 这个概率就是(鸟拉屎概率 x (车的长度 / 路的长度)):
1200522 1200946 100000000
0.01200522 0.01200946
以上结论的主要条件就是等概率拉屎, 但是我认为等概率拉屎这个假设是有意义的, 因为鸟无法存储粪便, 所以即使在飞的时候也可能拉屎. 但是鸟呆在树上的时间会更长吗? 我不知道, 就假设和空中等价吧. (这里需要考虑的就是, 鸟在树上一段时间之后就会飞走, 而树的高度又相对有限, 而空中的高度相对无限, 所以空中有概率叠加多只鸟…不过这些太复杂了, 也没研究过, 所以, 还是假设一样一样一样)
我想起来以前想过一个问题, 下雨的时候跑回去和走回去会淋湿一样吗? 先不考虑空气动力因素(因为跑回去的时候周围空气流动速度快, 会把雨水’吸’过来, 但是人跑的速度也不会很快, 所以先不考虑吧). 下雨至少可以认为是每个地方等概率的雨了, 所以现在好回答这个问题: 如果是相同的淋雨时间, 那么不管跑还是走还是不动, 淋湿程度是相同的; 如果淋雨时间不同, 那么呆在雨里的时间更短, 则淋湿程度越低(也就是跑), 不过淋湿是会饱和的, 如果湿透了, 那就不能更湿了.