【问题标题】:Probability simulation概率模拟
【发布时间】:2019-01-15 05:27:37
【问题描述】:

有人要求我模拟打印机是否在一天中的每一小时后工作(即 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 Chance:
    if i > 0.1:
        Status.append('Working')
    else:
        Status.append('Broken')
Chance, Status

我的问题是我无法根据前一个事件模拟当前事件,即如果前一个事件被破坏了如何将当前事件的概率调整为0.5。

【问题讨论】:

  • 首先,您可以使用Chance = np.random.uniform(size=24) 代替for 循环。其次,为什么第 6 行的Chance 一个人?

标签: python list for-loop simulation probability


【解决方案1】:

你需要先定义你的概率表,像这样:

                 |              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()

【讨论】:

    【解决方案2】:

    您应该记住上一步(小时)打印机的状态,并调整计算随机二进制输出的阈值:

    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')
    

    【讨论】:

      【解决方案3】:

      使用该脚本:

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-10
        • 1970-01-01
        • 2012-11-11
        • 2021-11-18
        • 2013-11-10
        • 2021-11-20
        相关资源
        最近更新 更多