通过Python编写模拟器对方案进行测试和分析的方法_Prj001

python使用uiautomator2操作雷电模拟器 本机环境:win10 64位,Python 3.10.4,雷电模拟器4.0.78,android版本7.1.2(设置-拉至最底部-关于平板电脑),adb版本(cmd进入pip3.exe的路径cd C:\Users\LC\AppData\Local\Programs\Python\Python310\Scripts。返回一次,可以在“关于平板电脑”看到“开发者选项”,如图。安装过程中出现了错误(虽然手机上也出现了小汽车图标,但最后运行程序也会报错)安装后,手机上就会出现小汽车的图标。 阅读详情
        在《Problem Solving with Algorithms and Data Structures》一书的第86页,作者(Brad Miller, David Ranum)提出了一个很有趣的问题并且通过Python写出的模拟程序进行了测试和分析。这种思考的方式很特别,可以说在程序执行之前,作者也不知道哪一个是最优方案,程序本身只是反映问题中的条件,而程序的运行则是对现实的模拟及对方案的测试。我觉得这种思路非常有借鉴价值,下面我就把问题和对应Python程序给出,供大家参考。(本文中Python程序的思路来源于上述这本书,但是PosPro做了一定的优化,并给出了详细的注释)


一、问题描述:
图书馆中有一台打印机,打印机有两种工作模式:每分钟10页(但打印质量较低),每分钟5页(打印效果较好)。打印机一次只能处理一个任务,其余任务可排队等候。
每个小时最多有10位学生在图书馆,他们在一小时终最多提交2次打印任务,每个打印任务的页数为1至20页不等。
问:综合分析两种打印模式,分析学生的平均等待打印时间和是否能在1小时内完成所有学生提交的打印任务


二、解决思路:
将打印机(Printer), 打印任务(Task)各自建立一个类,由于打印机对于任务的处理是逐条进行(FIFO),还可以建立一个Queue类,用于收集所有Task。
最后,建立一个模拟器(Simulator),该模拟器以一个3600次的循环来代表一小时的3600秒,通过在循环中的变化来体现一小时终可能出现的各种情况。


三、解决步骤
1. 建立一个队列数据结构Queue,只需要实现基本的enqueue, dequeue, isEmpty, size函数即可
# -*- coding=utf-8 -*-
# v150710_1 by PosPro
# please visit: http://blog.youkuaiyun.com/pospro
## 基于Python内置的list,实现先入先出(FIFO)的队列

class Queue:
	def __init__(self):
		self.qList=[]

	def enqueue(self, data):
		self.qList.append(data)
		## 向队列添加数据,复杂度为O(1)

	def dequeue(self):
		return self.qList.pop(0)
		## 删除数据复杂度O(n)

	def isEmpty(self):
		return self.qList==[]

	def size(self):
		return len(self.qList)

	def __str__(self):
		return self.qList.__str__()


'''以下部分仅作测试之用
q = Queue()
q.enqueue('hello')
print q
q.enqueue('dog')
print q
q.enqueue(3)
print q
q.dequeue()
print q
q.enqueue('cat')
print q
print str(q.size())
q.dequeue()
print q
print q.isEmpty()
q.dequeue()
print q
'''


2. 建立Printer类。显然在初始化该类时,必须告知其模式(10页/min? 5页/min?), 打印机显然需要知道自己是否当前处于工作状态,当前正在进行的任务还需多少时间才能完成。这三点就是Printer类必须具备的成员变量。打印机类的成员函数则应包括:isBusy,startTask, tick(用于和模拟时间相对应)。

由于每一个任务所对应的页数是不一样的,所以在startTask时,需要一个输入参数Task,Task本身将给出具体的页数。

# -*- coding=utf-8 -*-
# v150710_1 by PosPro
# please visit: http://blog.youkuaiyun.com/pospro
## 建立一个可以用于模拟的Printer

from Queue import Queue

class Printer:
	def __init__(self, pagesPerMinute):
		self.ppm=pagesPerMinute
		self.isWorking=False
		self.timeRemaining=0

	def isBusy(self):
		return self.isWorking

	def startTask(self, task):
		self.isWorking=True
		self.timeRemaining=task.getPages()*60/self.ppm
		## 上句得出的是新任务需要多少秒后才能完成, 60带来的是从分钟到秒的变换

	##这个函数是模拟器工作的关键,它将1次循环和1秒对应了起来
	def tick(self): 
		if self.timeRemaining>0:
			self.timeRemaining-=1
			if self.timeRemaining<=0:
				self.timeRemaining=0
				self.isWorking=False


3. 建立Task类。由于每个任务所对应的打印页数是随机的,所以在初始化该函数时需要随机生成页数。同时,为了计算任务在队列中的等待时间,Task类还应记录生成时的时间戳(由Simulator提供,Task自己记录)
# -*- coding=utf-8 -*-
# v150710_1 by PosPro
# please visit: http://blog.youkuaiyun.com/pospro
## 建立一个可以随机生成打印页数的Task, 该Task同时还记录了任务产生时的时间戳

import random

class Task:
	def __init__(self, time):
		self.pages=random.randrange(1,21) ## 生成1~20的随机页数
		self.timestamp=time

	def getPages(self):
		return self.pages

	def getTimestamp(self):
		return self.timestamp

	def waitTime(self, currentTime):
		return currentTime-self.timestamp


4. 建立测试函数Simulator。以一个3600次的循环模拟一小时中的3600秒,在每一个循环(每一秒),以此驱动打印任务的产生,打印任务的执行。在循环结束后汇总分析。
在其中有一个辅助函数isNewTaskEmerge(),其原理如下,因为题目中的描述是,每个小时最多有10位学生在图书馆,他们在一小时终最多提交2次打印任务。换而言之,一小时内最多有20次任务,也即180秒内可能产生1次任务。但是产生任务的具体时间是随机的,所以这个辅助函数在每秒钟抽取一下1~180之间的随机数,如果等于某个特定值就认为有新任务产生(这个特定值具体是多少无关紧要,只要在180以内,在某个特定秒,概率都是1/180。本例中取11)。
# -*- coding=utf-8 -*-
# v150710_1 by PosPro
# please visit: http://blog.youkuaiyun.com/pospro
## 以一个3600次的循环模拟一小时中的3600秒,在每一个循环(每一秒),
## 以此驱动打印任务的产生,打印任务的执行。在循环结束后汇总分析

import random
from Queue import Queue
from Printer import Printer
from Task import Task

'''
isNewTaskEmerge(),是一个辅助函数,其原理如下:
因为题目中的描述是,每个小时最多有10位学生在图书馆,
他们在一小时终最多提交2次打印任务。
换而言之,一小时内最多有20次任务,也即180秒内可能产生1次任务。
但是产生任务的具体时间是随机的,所以这个辅助函数在每秒钟抽取一下1~180之间的随机数,
如果等于某个特定值就认为有新任务产生
这个特定值具体是多少无关紧要,只要在180以内,在某个特定秒,概率都是1/180。
本例中取11。
'''
def isNewTaskEmerge():
	randoNum=random.randrange(1,181)
	if randoNum==11:
		return True  ## 此时将产生一个新任务
	else:
		return False

def Simulator(totalTime, pagesPerMinute):
	libraryPrinter=Printer(pagesPerMinute)
	printTaskQueue=Queue() # 保存所有生成的Task
	waitingTime=[]  #以一个队列保存所有Task的等待时间

	for t in range(totalTime): ##totalTime就是测试的总时间,循环一次是1秒
		if isNewTaskEmerge():
			newTask=Task(t) #传入当前时间t作为时间戳
			printTaskQueue.enqueue(newTask)

		if libraryPrinter.isBusy():
			libraryPrinter.tick()	#如果打印机当前有任务,则继续工作
		else: 
			if not printTaskQueue.isEmpty():
				nextTask=printTaskQueue.dequeue()
				waitingTime.append(nextTask.waitTime(t)) 
				#传入当前时间以便计算在该任务在队列中的等待时间
				libraryPrinter.startTask(nextTask)

	avgWaitTime=sum(waitingTime)/len(waitingTime)
	print "Average Wait %6.2f secs %3d tasks remaining."%(avgWaitTime, printTaskQueue.size())



## 以下代码启动测试程序
print "=== Mode 5 pages/min ====="
for i in range(10): #每种工作模式测试10次
	Simulator(3600, 5)

print
print "=== Mode 10 pages/min ====="
for i in range(10): #每种工作模式测试10次
	Simulator(3600, 10)


5. 运行
Simulator的末尾的一段程序,启动了一次测试。每种工作模式各执行10次
将以上四个文件放到同一文件夹下,执行截图中所示的命令



Python-------实现人生重开模拟器 写到这里,相信大家对这款小游戏制作有提升了不少的认识。虽然我们这这里只写了一个幼年阶段,但我相信,只要你们看完这篇文章,一定会有能力继续去实现其余的人生阶段,令游戏变得更加完善。See You ~ 阅读详情

相关推荐

利用python编写一个pc模拟器明日方舟脚本

前言 首先,我知道通过按键精灵等插件实现类似的效果,但是我主要是无聊了想写一个。。 其次,更关键的是,该脚本除了可以自动刷图+自动嗑体力药剂以外,还能够在体力药剂用完的时候,不会碎石去恢复体力哦!(即脚本自动停止)(这是按键精灵做不到的吧,嘿嘿) 最后另外再废话两句,我写该脚本的另一个目的是想学习下python捕捉窗口,鼠标这些信息的函数,之前从来没有干过类似的事,就顺便学习下了,就算对游戏无兴趣...

gzt940726的博客 2万+

四款Python在线模拟器

一、菜鸟工具地址:http://c.runoob.com/compile/9打开的界面是酱紫的左边是代码输入框,右边是结果输出框特点:1.支持切换Python2/Python3版本2.不...

菜鸟学Python数据分析 2万+

termux上安装Python

Termux是一款Android平台下的终端模拟器和Linux环境应用,它允许用户在移动设备上访问Linux命令行界面,以便使用命令行工具、脚本、开发环境等功能。但是,这里要注意的是,如果要运行爬虫的话,请先导入模块库,可以用pip命令下载,这里就不详细讲了!如果Python已成功安装,则应显示Python版本信息。这里为了方便,大家可以去下载迅雷云盘,搜索"输入"python",回车,即可进入。",下载里面有软件和其他应用介绍!

2301_80124151的博客 4860

micropython仿真器_microbit/cpx 的 python模拟器:Device Simulator Express

Device Simulator Express是一个 VSCode 的编程扩展,使用它无需硬件就能对 Circuit Playground Express(CPX)或 BBC micro:bit 仿真和调试python程序,此外还可以通过串口观察设备的输出。Device Simulator Express 和 makecode 中的设备模拟器功能类似,但它是一个 python 程序的模拟器,也是...

weixin_35738304的博客 3495

pyfcemu:用Python编写的NES模拟器

PyFCEmu 这是用Python编写的NES模拟器。 我写了一个numpy类型版本和原始类型版本。 但是,性能都很慢,并且6502 cpu比它们快100倍:-( 我认为不建议使用Python编写模拟器。 该代码被引用到项目 ,这是用Go编写的NES模拟器。 感谢fogleman!

四款Python在线模拟器[项目代码]

本文介绍了四款Python在线模拟器,分别是菜鸟工具、在线工具、ideone和Colaboratory Google。菜鸟工具支持Python2/Python3版本切换,但不支持常用导入模块,运行速度较慢。在线工具同样支持版本切换,提供代码格式化功能,运行速度较快且支持代码保存。ideone支持Python3版本和常用导入模块,运行速度尚可,但不支持图形输出。Colaboratory Google功能最为强大,支持版本切换、常用导入模块、类似于Jupyter Notebook的环境,以及代码存储、分享、下载等功能,但需要海外访问和Google账号登录。

python在线模拟_在线模拟运行Python工具/Skulpt工具

Skulpt客户端Python模拟器说明1. Skulpt是一个完全依靠浏览器端模拟实现Python运行的工具2. 不需要预处理、插件或服务器端支持,只需编写python并重新载入即可。3. 由于代码完全是在浏览器中运行的,所以不必担心“服务器崩溃”问题。Demo测试示例点击显示/隐藏【帮助信息】, 或查看示例:默认示例①②③④⑤⑥⑦⑧.按下 Ctrl-Enter 运行代码.可使用常用的快捷键进行...

weixin_39989949的博客 2732

deepseek本地部署及应用部署指南

如果你找到的日志是[send] via NET/IB/0,则表示网络通信是通过IB网络的,但是没有开启GDRDMA技术,则会有大致5%的性能损耗(网传,未实测)。新增的环境变量配置,主要用于启用IB网络通信,而非使用以太网进行通信,详细的每一个参数的具体含义,可以在英伟达NCCL的官方网站上找到说明。下一步,我会对已经完成部署的模型进行压测,来探索系统的性能极限在哪里,以及如何在生产环境中何如进行进一步的性能优化,期待你的关注。

weixin_39797121的博客 2623

python 模拟考试_使用python对网站进行测试(模拟用户行为)

日常工作过程中,我们需要对网站的并发量、响应时间进行测试,这种测试通常是对网站平台的测试,其原理是:客户端发出一个请求,服务端收到这个请求给予相应的响应,从收到请求到做出响应的这一段时间称为系统的响应时间,而系统在不同的负载,即不同的用户访问数的情况下,这个响应时间是不相同的。实际应用中能这些点的第三方软件很多,但不是本文的重点,所以本文中,我们利用python脚本来编写一段简单的代码来实现网站...

weixin_39847034的博客 376

modbus-esp8266库深度解析:工业级Modbus协议栈实现

Modbus是一种广泛应用于工业自动化领域的通用串行通信协议,其核心在于标准化的功能码、寄存器模型与帧结构设计。基于RTU、ASCII和TCP三种传输变体,Modbus协议通过主从架构实现设备间可靠数据交互,具备低开销、高兼容性与强实时性等技术价值。在边缘计算与工业物联网场景中,它被广泛用于PLC通信、传感器数据采集、HMI集成及远程固件升级(FOTA)等关键任务。针对ESP8266/ESP32等Wi-Fi微控制器平台,modbus-esp8266库提供了完整协议栈支持,涵盖多实例并发、回调驱动架构、零拷贝

weixin_42315569的博客 349

保姆级教程:在iQuant平台从零写一个Python量化策略(附完整代码示例)

本文提供了一份详细的iQuant平台Python量化策略开发教程,从环境准备到策略实现、回测优化,再到实盘运行,每个步骤都配有完整代码示例和常见问题解决方案。适合量化交易新手快速上手,掌握双均线策略等核心开发技巧。

weixin_42783709的博客 478

chatgpt赋能python:Python模拟器:让编程过程更加高效,让学习更加有趣

本文由chatgpt生成,文章没有在chatgpt生成的基础上进行任何的修改。以上只是chatgpt能力的冰山一角。作为通用的Aigc大模型,只是展现它原本的实力。对于颠覆工作方式的ChatGPT,应该选择拥抱而不是抗拒,未来属于“会用”AI的人。🧡AI职场汇报智能办公文案写作效率提升教程 🧡专注于AI+职场+办公方向。下图是课程的整体大纲下图是AI职场汇报智能办公文案写作效率提升教程中用到的ai工具。

b45e1933f46的博客 657

Unity零基础到入门 ☀️| 小万字教程 对 Unity 中的 协程 ❤️全面解析+实战演练❤️

Unity,为了让Unity基础知识专栏更加完善,又肝了一篇协程来学习。 协程在Unity中还是很常用的,一起来看一下协程的基本概念和使用方法吧!

努力前行,总会成为自己心中的那道光 8万+

PyMaLab: Python 高级模拟器

PyMaLab: Python 高级模拟器 PyMaLab 是一个基于 Python 的高级模拟器,旨在为工程师、科学家和学生提供一种方便的工具,用于探索和分析复杂的系统行为。它结合了 MATLAB 和 Simulink 的功能,并以 Python 语言为基础,使得用户能够轻松创建和执行动态模型。 项目简介 PyMaLab 是一个开源项目,由 Eric Schefter 开发。它的主要目标是将 M...

gitblog_00066的博客 538

OPC通信从入门到精通_1_OPC基础知识及简单C#程序编写(OPCDA,OPCUA简介;OPC通信数据流框架图;C#程序编写)

ModbusTCP通信是采用直接方式进行通信,用OPC的方式如何去做呢?PLC作为ModbusTCP服务器,用KepServer作为ModbusTCP客户端,同时作为OPC服务器,PC作为OPC客户端新建项目,加载dll库(利用COM技术写的)添加引用,查看到其中包含了众多方法其中OPCGroups继承于IOPCGroups接口。

分享学习成长历程,Winter is coming! 1万+

Codex入门10-Goal自主任务(进阶必学:设定目标就不管了,AI自己干活到完成)

/goal 是Codex CLI最强大的进阶功能——设定一个目标,AI就会制定计划、分步执行、自我测试、持续迭代,即使你关掉终端也会继续。本文详解/goal的工作原理、配置启用方法、常用命令(pause/resume/status/clear),以及如何写出高质量的目标描述让AI高效自主完成任务。

yueyeguzhuo的专栏 454

chatgpt赋能python:Python操作模拟器:实现模拟操作的利器

Python操作模拟器是一种Python语言的模拟器,它能够模拟计算机系统,仿真实际的环境,并处理计算机操作,这意味着,您可以使用它来传达指令和执行操作来模拟计算机的行为。Python操作模拟器在软件开发、测试、教育方面,都非常有用。本文由chatgpt生成,文章没有在chatgpt生成的基础上进行任何的修改。以上只是chatgpt能力的冰山一角。作为通用的Aigc大模型,只是展现它原本的实力。对于颠覆工作方式的ChatGPT,应该选择拥抱而不是抗拒,未来属于“会用”AI的人。

atest166的博客 745

OPTEE常见13类问题与解答

OPTEE常见13类问题并解答

AI-安全-功耗 1202

chatgpt赋能python:利用Python编写模拟器:一种循序渐进的方法

模拟器的第一步是定义数据结构。通常,我们会定义一些类来表示模拟器中的各种对象,例如指令、寄存器、内存等等。使用类可以方便我们在模拟器程序中定义各种变量和方法,并且可以使代码更具可读性和可维护性。此时,确定好自己想模拟的程序类型和需要的数据结构会大大提高代码的书写优雅度,针对不同类型的程序,不同数据结构的选择也不尽相同,这要求我们在进行编写模拟器时,认真仔细地考虑,并根据实际情况去进行抉择。在模拟器中,我们需要定义一些指令集,这些指令将在模拟器中运行,并且可以修改模拟器状态。每个指令的作用和操作数也需要明确。

qq_45562973的博客 1004

YOLOv11 | 一文带你深入理解ultralytics最新作品yolov11的创新 | 训练、推理、验证、导出 (附网络结构图)

ultralytics发布了最新的作品YOLOv11,这一次YOLOv11的变化相对于ultralytics公司的上一代作品YOLOv8变化还是很大的(YOLOv9、YOLOv10均不是ultralytics公司作品),其中改变的位置涉及到C2f变为C3K2,在SPPF后面加了一层类似于注意力机制的C2PSA,还有一个变化大家从yaml文件是看不出来的就是它的检测头内部替换了两个DWConv,在损失函数方面就没有变化了还是采用的CIoU作为边界框回归损失,下面带大家深入理解一下ultralytics最新作品

Snu77的博客 18万+

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

python编写选项_pymterm 在python中实现多个选项卡的终端模拟器

pymtermA multiple tab terminal emulator implemented in pythonRender system can using native, opengl, will first try opengl when available otherwise fall back to native render OpenGL renderpygame backe...

weixin_39901203的博客 159

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

用python 中的random模块写一个游戏模拟器小游戏 超简单!

随机产生的数:0:输出:进入战斗。# 随机产生的数:1:输出:捡到宝箱。# 随机产生的数:2:输出:捡到武器。# 随机产生的数:3:输出:捡到弹药。# 随机产生的数:4:输出:踩到陷阱。# 随机产生的数:5:输出:无事件。

k321805624的博客 1250

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

在UBuntu下玩FC和街机模拟器

我不是太爱玩游戏,所以Linux下我并没有特别关心游戏的问题。不过有一天,突然觉得想起以前在Windows下玩过的VirtualNES FC(红白机)模拟器和Nebula街机模拟器了。也许是怀旧的缘故吧,觉得能再玩一玩 魂斗罗、合金弹头、KOF97 这样的游戏也是一种不错的享受。FC模拟器:fceu安装很简单:sudo apt-get install fceu 就可以了。只是它的配置颇花了

令狐虫的Linux空间 1万+

python秃头之路之pygame小游戏

1

changfcqxhy的博客 391

python写计算机模拟器_【Python】雷电模拟器说明[附代码]

[Python] 纯文本查看 复制代码class Dnconsole:# 请根据自己电脑配置console = 'D:\\Changzhi\\dnplayer2\\dnconsole.exe 'ld = 'D:\\Changzhi\\dnplayer2\\ld.exe 'share_path = 'F:/share/Pictures'#获取模拟器列表@staticmethoddef get_lis...

weixin_39624716的博客 2852

Pyte - Python 虚拟终端库

是一个用 Python 编写的轻量级虚拟终端库。它可以帮助开发者在自己的应用程序中实现基于文本的命令行交互,支持各种常见的 VT100/102 控制序列,并提供了良好的可扩展性。 ## Pyte 的用途 Pyte 可以用于以下场景: - 在 GUI 应用程序或 Web 应用程序中构建嵌入式的命令行界面。 - 实现自定义的 SSH 客户端、Tmux 等终端模拟器。 - 开发自动化测试工具,需要

gitblog_00084的博客 1174
上一篇: 我的书单和简单书评(持续更新)
下一篇: 利用递归法和pygame实现迷宫寻路的动态展示_Prj002
PosPro
博客等级 码龄12年 28粉丝 26原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值