随机生成正确的or错误的四则运算表达式
Posted okcokc
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了随机生成正确的or错误的四则运算表达式相关的知识,希望对你有一定的参考价值。
背景
在做某个项目的时候需要产生大量正确的or错误的四则运算表达来作为测试样例,bug的发现在于产生测试样例的程序中。
程序的实现思路
产生正确的表达式的实现思路
- 随机产生式子长度
expressionLength
- 式子长度大于1则随机判断是否生成左括号
- 生成操作数
- 生成运算符
- 式子长度大于1则随机判断是否生成左括号
- 式子长度
expressionLength
减1 - 生成操作数
- 随机判断是否匹配右括号
- 当式子长度
expressionLength
大于0时不断重复第10步到第14步 - 式子长度
expressionLength
减1 - 生成运算符
- 式子长度大于1则随机判断是否生成左括号
- 生成操作数
- 随机判断是否匹配右括号
- 如果还有左括号没有匹配,则在最后匹配上所有右括号(此处右括号的产生不再随机,而是必定产生)
产生错误的表达式的实现思路
上文的正确表达式的产生中有4种输出步骤:操作数、运算符、左括号、右括号,其中括号是概率生成。而错误的表达式就是在正确的表达式的基础上,用一个概率让且仅让一个输出步骤不进行输出(比如一个加号、一个减号、一个操作数1……)。标识符isWrongExpression
表示将输出错误表达式,变量notMiss
表示某一个步骤不丢失的概率。
每次执行输出步骤的函数,都要执行以下步骤:
- 变量
notMiss
初始化置为1,表示不丢失 - 如果标志
isWrongExpression
为真,则让变量notMiss
以一定概率变为0(该输出步骤丢失的概率),同时将标志isWrongExpression
置为假(因为只需要让一个输出步骤丢失) - 在每次进行输出时都添加判断,若变量
notMiss
为0则不输出。
因为输出步骤丢失为概率事件,因此可能出现都不丢失的情况,此时强制让最后一个操作数进行丢失操作。
BUG
这时候bug出现了:存在输出步骤全都不丢失的情况。
解决问题
一开始进行debug,因为很多步骤的出现都是概率事件,所以bug出现的概率不定,问题点也很难找到(也是自己debug能力不足的原因)。一开始以为是最后的强制丢失出现了问题。后来发现当标志isWrongExpression
为假,同时变量notMiss
为0时,出现不丢失,此时不会触发强制丢失。后来在经历了长时间逐步调试后,找到了满足丢失条件但没有执行丢失步骤的地方——匹配右括号操作。
问题找到了。因为左右括号的出现都是概率事件,一开始代码的设计是:
- 概率筛选是否丢失
- 概率筛选是否生成括号
- 若生成括号,再判断是否丢失来决定是否进行输出
bug出现的原因在于,概率筛选结果为丢失,然后修改了标志isWrongExpression
和变量notMiss
;尔后若概率筛选不生成括号,也就是要丢失的内容是不存在的东西。但此时标志位已经被修改为“已经产生了丢失”状态了。解决方法很简单:在概率筛选结果为生成括号之后,再进行概率筛选是否丢失即可。
反思
应该在需要用到的时候才进行变量的定义、函数的调用等等。此处在一开始的时候就一股脑的认为每个生成步骤都需要进行概率筛选是否丢失,因此在每个步骤的一开始就进行了函数processMissP()
的调用。
以上是关于随机生成正确的or错误的四则运算表达式的主要内容,如果未能解决你的问题,请参考以下文章