使用Python生成基于百分比机会的随机数



我有一个设备可以在两种状态下运行-打开和关闭。

在一天中的某个时间段(比如早上6点到晚上8点(之间,它有5%的机会打开,95%的机会关闭。

在剩下的时间段(晚上8点到早上6点(之间,它有75%的机会打开。

如果输出是1s和0s的数组,并且长8760行(一年中的每小时(,我如何使用Python中的随机数生成器来生成一年的开/关状态的时间序列?

您可以使用类似int(random.random() <= 0.75)的东西。它将在75%的时间内返回1,否则返回0。例如:

import random
from datetime import datetime
if 6 < datetime.now().hour < 20:
print(int(random.random() <= 0.05))
else:
print(int(random.random() <= 0.75))

您可以将random.choices()weights参数一起使用:

from datetime import datetime
from random import choices
if 6 < datetime.now().hour < 20:
weights = 95, 5   # 95% - False (Off), 5% - True (On)
else:
weights = 25, 75  # 25% - False (Off), 75% - True (On)
state = bool(choices(range(2), weights=weights)[0])

或者你可以在一行中写同样的内容

state = bool(choices(range(2), weights=(95, 5) if 6 < datetime.now().hour < 20 else (25, 75))[0])

上升

从更新后的问题中可以清楚地看出,您需要为全年的每个小时生成列表。

代码:

from calendar import isleap
from random import choices
year = 2021
states = []
for _ in range(365 + isleap(year)):  # iterate over days
for i in range(24):              # iterate over hours
if 8 < i < 20:
states += choices(range(2), weights=(95, 5))
else:
states += choices(range(2), weights=(25, 75))
# OR one-liner
states = [choices(range(2), weights=(95, 5) if 6 < i < 20 else (25, 75))[0] for i in range(24) for _ in range(365 + isleap(year))]

最新更新