Python 概率模拟
我被要求模拟一天中每小时(即24小时)打印机是否工作。如果打印机在一小时后工作,那么它工作的概率为90%,在下一小时结束时被损坏的概率为10% 如果它坏了,那么它在下一个小时工作或被坏的概率为50% 假设随机均匀分布,打印机工作的第一个小时 我的Python代码如下:Python 概率模拟,python,list,for-loop,simulation,probability,Python,List,For Loop,Simulation,Probability,我被要求模拟一天中每小时(即24小时)打印机是否工作。如果打印机在一小时后工作,那么它工作的概率为90%,在下一小时结束时被损坏的概率为10% 如果它坏了,那么它在下一个小时工作或被坏的概率为50% 假设随机均匀分布,打印机工作的第一个小时 我的Python代码如下: Chance = [] Status = [] for i in range(24): Chance.append(random.uniform(0,1)) Chance[0] = 1 Chance for i in C
Chance = []
Status = []
for i in range(24):
Chance.append(random.uniform(0,1))
Chance[0] = 1
Chance
for i in Chance:
if i > 0.1:
Status.append('Working')
else:
Status.append('Broken')
Chance, Status
我的问题是,我无法基于上一个事件模拟当前事件,即,如果上一个事件被破坏,我如何将当前事件的概率调整为0.5。您应该记住上一步(小时)打印机的状态,并调整计算随机二进制输出的阈值:
status = []
lastStatus = True # Assume it was working
for i in range(24):
threshold = 0.1 if lastStatus else 0.5
lastStatus = random.uniform(0, 1) > threshold
status.append('Working' if lastStatus else 'Broken')
您应该记住上一步(小时)打印机的状态,并调整用于计算随机二进制输出的阈值:
status = []
lastStatus = True # Assume it was working
for i in range(24):
threshold = 0.1 if lastStatus else 0.5
lastStatus = random.uniform(0, 1) > threshold
status.append('Working' if lastStatus else 'Broken')
您需要先定义概率表,如下所示:
| NEXT STATE |
| WORKING | BROKEN |
CURRENT| WORKING | 0.9 | 0.1 |
STATE |---------|-------------------|--------------------|
| BROKEN | 0.5 | 0.5 |
import random
# The table above
table = [[.9,.1],[.5,.5]]
def simulate():
# 0 means working, 1 means broken
current_state = 0
# Initialise variable
next_state = current_state
for i in range(24):
# Get a number between 0 and 1
chance = random.uniform(0, 1)
# Given my current state (line 0 or 1), what chance do I have
# to work the next hour ?
if chance <= table[current_state][0]:
# The chance variable has more chance to be under if the number
# in the table is high.
next_state = 0
else:
# BROKEN
next_state = 1
current_state = next_state
print("Current state " + ("Working" if current_state == 0 else "Broken"))
if __name__ == "__main__":
simulate()
以便能够非常轻松地更改值。您甚至可以轻松地添加新状态。像这样使用它:
| NEXT STATE |
| WORKING | BROKEN |
CURRENT| WORKING | 0.9 | 0.1 |
STATE |---------|-------------------|--------------------|
| BROKEN | 0.5 | 0.5 |
import random
# The table above
table = [[.9,.1],[.5,.5]]
def simulate():
# 0 means working, 1 means broken
current_state = 0
# Initialise variable
next_state = current_state
for i in range(24):
# Get a number between 0 and 1
chance = random.uniform(0, 1)
# Given my current state (line 0 or 1), what chance do I have
# to work the next hour ?
if chance <= table[current_state][0]:
# The chance variable has more chance to be under if the number
# in the table is high.
next_state = 0
else:
# BROKEN
next_state = 1
current_state = next_state
print("Current state " + ("Working" if current_state == 0 else "Broken"))
if __name__ == "__main__":
simulate()
随机导入
#上表
表=[.9,1]、.5,5]]
def simulate():
#0表示工作,1表示损坏
当前状态=0
#初始化变量
下一个\u状态=当前\u状态
对于范围(24)内的i:
#获取一个介于0和1之间的数字
机会=随机。均匀(0,1)
#考虑到我目前的状态(第0行或第1行),我有什么机会
#下个小时还要工作吗?
如果chance您需要在之前定义您的概率表,如下所示:
| NEXT STATE |
| WORKING | BROKEN |
CURRENT| WORKING | 0.9 | 0.1 |
STATE |---------|-------------------|--------------------|
| BROKEN | 0.5 | 0.5 |
import random
# The table above
table = [[.9,.1],[.5,.5]]
def simulate():
# 0 means working, 1 means broken
current_state = 0
# Initialise variable
next_state = current_state
for i in range(24):
# Get a number between 0 and 1
chance = random.uniform(0, 1)
# Given my current state (line 0 or 1), what chance do I have
# to work the next hour ?
if chance <= table[current_state][0]:
# The chance variable has more chance to be under if the number
# in the table is high.
next_state = 0
else:
# BROKEN
next_state = 1
current_state = next_state
print("Current state " + ("Working" if current_state == 0 else "Broken"))
if __name__ == "__main__":
simulate()
以便能够非常轻松地更改值。您甚至可以轻松地添加新状态。像这样使用它:
| NEXT STATE |
| WORKING | BROKEN |
CURRENT| WORKING | 0.9 | 0.1 |
STATE |---------|-------------------|--------------------|
| BROKEN | 0.5 | 0.5 |
import random
# The table above
table = [[.9,.1],[.5,.5]]
def simulate():
# 0 means working, 1 means broken
current_state = 0
# Initialise variable
next_state = current_state
for i in range(24):
# Get a number between 0 and 1
chance = random.uniform(0, 1)
# Given my current state (line 0 or 1), what chance do I have
# to work the next hour ?
if chance <= table[current_state][0]:
# The chance variable has more chance to be under if the number
# in the table is high.
next_state = 0
else:
# BROKEN
next_state = 1
current_state = next_state
print("Current state " + ("Working" if current_state == 0 else "Broken"))
if __name__ == "__main__":
simulate()
随机导入
#上表
表=[.9,1]、.5,5]]
def simulate():
#0表示工作,1表示损坏
当前状态=0
#初始化变量
下一个\u状态=当前\u状态
对于范围(24)内的i:
#获取一个介于0和1之间的数字
机会=随机。均匀(0,1)
#考虑到我目前的状态(第0行或第1行),我有什么机会
#下个小时还要工作吗?
如果有机会使用该脚本:
import random
broken_probability = 0
for i in range(24):
if random.randrange(100) > broken_probability:
status = 'Working'
broken_probability += 10
else:
status = 'Broken '
broken_probability = 50
print('Hour: {} - Status: {} - Broken Probability: {}'.format(str(i).zfill(2), status, broken_probability))
我得到了以下结果:
Hour: 00 - Status: Working - Broken Probability: 10
Hour: 01 - Status: Working - Broken Probability: 20
Hour: 02 - Status: Broken - Broken Probability: 50
Hour: 03 - Status: Broken - Broken Probability: 50
Hour: 04 - Status: Broken - Broken Probability: 50
Hour: 05 - Status: Broken - Broken Probability: 50
Hour: 06 - Status: Working - Broken Probability: 60
Hour: 07 - Status: Broken - Broken Probability: 50
Hour: 08 - Status: Broken - Broken Probability: 50
Hour: 09 - Status: Working - Broken Probability: 60
Hour: 10 - Status: Broken - Broken Probability: 50
Hour: 11 - Status: Broken - Broken Probability: 50
Hour: 12 - Status: Working - Broken Probability: 60
Hour: 13 - Status: Broken - Broken Probability: 50
Hour: 14 - Status: Broken - Broken Probability: 50
Hour: 15 - Status: Working - Broken Probability: 60
Hour: 16 - Status: Working - Broken Probability: 70
Hour: 17 - Status: Broken - Broken Probability: 50
Hour: 18 - Status: Broken - Broken Probability: 50
Hour: 19 - Status: Broken - Broken Probability: 50
Hour: 20 - Status: Broken - Broken Probability: 50
Hour: 21 - Status: Working - Broken Probability: 60
Hour: 22 - Status: Broken - Broken Probability: 50
Hour: 23 - Status: Working - Broken Probability: 60
用这个脚本:
import random
broken_probability = 0
for i in range(24):
if random.randrange(100) > broken_probability:
status = 'Working'
broken_probability += 10
else:
status = 'Broken '
broken_probability = 50
print('Hour: {} - Status: {} - Broken Probability: {}'.format(str(i).zfill(2), status, broken_probability))
我得到了以下结果:
Hour: 00 - Status: Working - Broken Probability: 10
Hour: 01 - Status: Working - Broken Probability: 20
Hour: 02 - Status: Broken - Broken Probability: 50
Hour: 03 - Status: Broken - Broken Probability: 50
Hour: 04 - Status: Broken - Broken Probability: 50
Hour: 05 - Status: Broken - Broken Probability: 50
Hour: 06 - Status: Working - Broken Probability: 60
Hour: 07 - Status: Broken - Broken Probability: 50
Hour: 08 - Status: Broken - Broken Probability: 50
Hour: 09 - Status: Working - Broken Probability: 60
Hour: 10 - Status: Broken - Broken Probability: 50
Hour: 11 - Status: Broken - Broken Probability: 50
Hour: 12 - Status: Working - Broken Probability: 60
Hour: 13 - Status: Broken - Broken Probability: 50
Hour: 14 - Status: Broken - Broken Probability: 50
Hour: 15 - Status: Working - Broken Probability: 60
Hour: 16 - Status: Working - Broken Probability: 70
Hour: 17 - Status: Broken - Broken Probability: 50
Hour: 18 - Status: Broken - Broken Probability: 50
Hour: 19 - Status: Broken - Broken Probability: 50
Hour: 20 - Status: Broken - Broken Probability: 50
Hour: 21 - Status: Working - Broken Probability: 60
Hour: 22 - Status: Broken - Broken Probability: 50
Hour: 23 - Status: Working - Broken Probability: 60
首先,您可以使用Chance=np.random.uniform(size=24)
代替for循环。第二,为什么第6行中有Chance
都是单独的呢?首先,你可以做Chance=np.random.uniform(size=24)
而不是for循环。第二,为什么你在第6行就有了机会?