"""
问题描述:
实验室有10个学生 ,一个小时每人可以打印两次(用来计算一秒的打印概率)
一个学生每次大概打印1-20页(打印任务的页数)
打印机每分钟可以打印页数为 pagePerminute(注意分钟与秒的转换)
问:numseconds(一段时间)内实验室学生要执行一次打印任务平均的等待时间为多少 averages_waittime
输入:
numseconds(一段时间) pagePerminute(打印机每分钟打印页数)
输出:
average_waittime(平均等待时间)
"""
第一、计算每秒的打印事件发生的概率
第二、如果有打印发生,则创建打印任务,将其加入等待队列中
第三、如果打印机空闲并且打印队列中有任务等待,则将队列头位置打印任务拿出,计算其等待时间,将结果放入等待时间列表中,确认可以开启打印任务
第四、执行打印任务
第五、计算平均等待时间(所有任务等待时间之和 / 总任务个数)
主代码:
"""
打印机:
输入--》 总时间,打印机每分钟打印的页数
输出--》 学生的平均等待时间
平均等待时间 = 所有任务的等待时间 /总任务数
"""
import random
import queue
from Task1 import Task
from Printer1 import Priter
def createPtask():
num = random.randrange(1, 181)
if num == 180:
return True
else:
return False
def simulationTime(numseconds, pageaPerminutes):
wait_time = []
waitQueue = queue.Queue()
labPriter = Priter(pageaPerminutes)
# 等待时间 = 开始打印时间 - 进入等待队列时间
for currentSeconds in range(numseconds):
# 判断是否有打印任务产生
if createPtask():
# 定义task类 加入等待队列中
task = Task(currentSeconds)
waitQueue.put(task)
# 如果当前打印机空闲并且队列中有值:
if not waitQueue.empty() and not labPriter.busy():
# 把等待队列中的头元素拿去打印
currenttask = waitQueue.get()
wait_time.append(currenttask.waittime(currentSeconds))
labPriter.startPrint(currenttask)
labPriter.runPrint()
averagetime = sum(wait_time) / len(wait_time)
print(' 平均等待时间为 %d 秒,剩余打印任务为 %d' % (averagetime, waitQueue.qsize()))
for i in range(10):
simulationTime(3600, 5)
Task类:
"""
Task 完成任务:
1、记录任务进入等待队列的时间
2、记录当前打印的页数
3、根据任务开始打印时间 与 任务进入等待队列时间得到任务的等待时间
"""
import random
class Task:
def __init__(self, time):
# 任务进入队列时间
self.inQtime = time
# 任务的打印页数
self.pages = random.randrange(1, 21)
# 任务的等待时间
def waittime(self, currentseconds):
return currentseconds - self.inQtime
# 任务的页数
def getpages(self):
return self.pages
打印机类:
"""
实现功能:
当前打印机是否处于工作状态
添加打印任务(将打印机置于工作状态,计算当前任务需要打印时间)
执行打印任务(根据当前任务所需时间来进行)
"""
class Priter:
def __init__(self, ppm):
self.currenttask = None
self.remainingtime = 0
self.ppm = ppm
def busy(self):
if self.currenttask != None:
return True
else:
return False
def startPrint(self, task):
self.currenttask = task
self.remainingtime = task.getpages() * 60 / self.ppm
def runPrint(self):
if self.currenttask != None:
self.remainingtime -= 1
if self.remainingtime < 0:
self.currenttask = None
结果:
平均等待时间为 89 秒,剩余打印任务为 0
平均等待时间为 167 秒,剩余打印任务为 2
平均等待时间为 176 秒,剩余打印任务为 2
平均等待时间为 30 秒,剩余打印任务为 0
平均等待时间为 70 秒,剩余打印任务为 1
平均等待时间为 32 秒,剩余打印任务为 0
平均等待时间为 196 秒,剩余打印任务为 0
平均等待时间为 65 秒,剩余打印任务为 0
平均等待时间为 36 秒,剩余打印任务为 1
平均等待时间为 85 秒,剩余打印任务为 1