热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

R语言之R程序(老虎机)

第一步,模拟动作。可以用sample函数随机生成三个符号,就像你在项目1中随机“掷”骰子一样。下面的函数能够从老虎机的常用符号中随机选择三个符号。这些常用符号包括:钻

第一步,模拟动作。可以用sample函数随机生成三个符号,就像你在项目1中随机“掷”骰子一样。下面的函数能够从老虎机的常用符号中随机选择三个符号。这些常用符号包括:钻石(DD)、七(7)、三条杠(BBB)、两条杠(BB)、一条杠(B)、樱桃©和零(0)。符号的选择完全是随机的,但是每个符号出现的概率各不相同。

get_symbols<-function()wheel<-c("DD",7","BBB","BB",“B",“C","0")sample(wheel,size&#61;3,replace&#61;TRUE, prob&#61;c(0.03,.03,0.06,0.1,0.25,0.01,0.52))

可以使用get_symbols随机生成老虎机中的三个符号。

在这里插入图片描述
每玩一次老虎机游戏需要花费一美元.转出的符号组合决定了玩家所能获得的中奖金额。钻石符号(DD)是可以百搭的,并且能够将最终的金额加倍。*表示任意符号

在这里插入图片描述

如果不能满足以下三种情形中的任意一种,玩家将一无所获。
(1)三个符号完全相同(但不能是符号零)。
(2)三个带杠的符号(任意组合)。
(3)一个或多个樱桃。
PS:(百搭牌(DD)的使用有一个例外:除非组合中已经有了一个樱桃,否则钻石不能被当作樱桃。
只要中奖组合中出现了钻石,奖金都会翻倍。


策略


1.有序步骤

生成符号组合→显示符号组合→根据符号组合计算中奖金额

play<-function(){#步骤1:生成符号组合symbols<-get_symbols()#步骤2:显示符号组合print(symbols)#步骤3:根据符号组合计算中奖金额score(symbols)}

2.同类情况

在这里插入图片描述


if语句

同其他高级语言的语法规则
(1) 下面的函数会返回什么结果?

x <-1if(3&#61;3){x<-2}x

答案:这段代码的返回值是2。
(2)

x <-1if(TRUE){x<-2}x}

练习 &#xff1a;

x<-1if(x&#61;&#61;1){x<-2
if(x&#61;&#61;1){x<-3}}x

答案:这段代码的返回值是2。


else语句

同其他高级语言的语法规则
比如&#xff1a; a <- 3.14
然后用trunc函数将小数部分提取出来。

dec<-a-trunc(a)dec

##0.14trunc函数接受一个数值作为它的输入,并返回该数值小数点左边的部分(也就是该数值的整数部分)。

if(#情形1:三个符号相同){prize<-查找对应的中奖金额}else if(#情形2:全是杠3)prize<-#分配5美元奖金} else{#计算樱桃的数量prize<-#计算中奖金额}

已经有了完成第一个子任务的代码,可以把它放进老虎机程序的代码中

same<-symbols[1]&#61;&#61;symbols[2]&&symbols[2]&#61;&#61;symbols[3]
bars<-symbols %in% c("B","BB","BBB"))
if(same){prize<-#查找对应的中奖金额
} else if(#情形2:全是杠){prize<-#分配5美元奖金
}else{#计算樱桃的数量prize<-#计算中奖金额
}

if(same){symbol<-symbols[1]if(symbol&#61;"DD"){ prize<-800}else if(symbol&#61;"7"){prize<-80}else if(symbol&#61;&#61;"BBB"){prize<-40}else if(symbol&#61;"BB"){prize<-25}
else if(symbol&#61;&#61;"B"){prize<-10}else if(symbol&#61;&#61;“C"){prize<-10else if(symbol&#61;&#61;"0"){prize<-0 } }

查找表

创建一个向量&#xff0c;将符号存储为名称,将中奖金额存储为元素值,并且将名称和相应的元素值一一对应起来。

payouts<-("DD"&#61;100,"7"&#61;80,"BBB"&#61;40,"BB"&#61;25,"B"&#61;10, "C"&#61;10, "0"&#61;0)payouts["DD"]

unname函数返回一个对象的副本,但是会将其名称属性移除。

#计算樱桃的数量{
cherries<-sum(symbols&#61;&#61;"C")prize<-c(0,2,5)[cherries&#43;1]
}diamonds<-sum(symbols&#61;"DD")#在需要的情况下,把奖金翻倍prize*2^diamonds

查找表与树

要将if树转换为查找表,首先明确要赋的值,并将这些值存储在一个向量中;然后,提取出if树中的各个条件语句作为选值的依据。如果条件中使用了字符串,就给向量的各元素赋予名称,然后用基于名称的取子集方法得到对应的元素;如果条件中使用了整数数值,就使用基于整数的取子集方法。


代码注释&#xff08;整体代码&#xff09;

代码中用#加些注释。通过注释对某些代码段的功能进行解释,这样可以增加代码的可读性。

score <- function(symbols){#识别情形same <- symbols[1] &#61;&#61; symbols[2] && symbols[2] &#61;&#61; symbols[3]bars <- symbols %in% c("B","BB","BBB")#计算中奖金额if (same){payouts <- c("DD" &#61; 100,"7" &#61; 80,"BBB" &#61; 40,"BB" &#61; 25,"B" &#61; 10, "C"&#61;10,"0" &#61; 0)prize <- unname(payouts[symbols[1]])}else if(all(bars)){prize <- 5}else{cherries <- sum(symbols &#61;&#61; "C")prize <- c(0,2,5)[cherries &#43; 1]}#根据钻石个数调整中奖金额diamonds <- sum(symbols &#61;&#61; "DD")prize * 2^ diamonds
}
get_symbols <- function(){wheel <- c("DD","7","BBB","BB","B","C","0")sample(wheel, size &#61; 3,replace &#61;TRUE,prob &#61; c(0.03,0.03,0.06,0.1,0.25,0.01,0.52))
}
play <- function(){symbols <- get_symbols()print(symbols)score(symbols)
}
play()

运行play()就可以实现”老虎机“.
在这里插入图片描述


小结

将任务分解为一些更简单的任务,如果有必要的话,把简单的任务再分解为更为简单的任务。如果可视化有用的话,可以用一个流程图将任务之间的关系表示出来。

然后对子任务实施各个击破。对每个子任务的解决方案都尝试用通俗的语言描述出来,然后再转换成R代码的形式。对于每一个子任务的代码,都要用实例进行测试。当每一个子任务都运行无误时,将所有子任务的代码整合成一个函数,以便分享和重复使用。

为了帮助完成这些工作,R提供了一些有用的工具。你可以用if和else语句处理不同的情形,也可以用R对象和取子集的方法创建一个查找表;可以用给代码添加注释,还可以用function函数将所写的程序包装成函数。


推荐阅读
  • IjustinheritedsomewebpageswhichusesMooTools.IneverusedMooTools.NowIneedtoaddsomef ... [详细]
  • 摘要: 在测试数据中,生成中文姓名是一个常见的需求。本文介绍了使用C#编写的随机生成中文姓名的方法,并分享了相关代码。作者欢迎读者提出意见和建议。 ... [详细]
  • 本文讨论了编写可保护的代码的重要性,包括提高代码的可读性、可调试性和直观性。同时介绍了优化代码的方法,如代码格式化、解释函数和提炼函数等。还提到了一些常见的坏代码味道,如不规范的命名、重复代码、过长的函数和参数列表等。最后,介绍了如何处理数据泥团和进行函数重构,以提高代码质量和可维护性。 ... [详细]
  • Commit1ced2a7433ea8937a1b260ea65d708f32ca7c95eintroduceda+Clonetraitboundtom ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • 标题: ... [详细]
  • 怎么在PHP项目中实现一个HTTP断点续传功能发布时间:2021-01-1916:26:06来源:亿速云阅读:96作者:Le ... [详细]
  • 纠正网上的错误:自定义一个类叫java.lang.System/String的方法
    本文纠正了网上关于自定义一个类叫java.lang.System/String的错误答案,并详细解释了为什么这种方法是错误的。作者指出,虽然双亲委托机制确实可以阻止自定义的System类被加载,但通过自定义一个特殊的类加载器,可以绕过双亲委托机制,达到自定义System类的目的。作者呼吁读者对网上的内容持怀疑态度,并带着问题来阅读文章。 ... [详细]
  • 小程序wxs中的时间格式化以及格式化时间和date时间互转
    本文介绍了在小程序wxs中进行时间格式化操作的问题,并提供了解决方法。同时还介绍了格式化时间和date时间的互相转换的方法。 ... [详细]
  • Android自定义控件绘图篇之Paint函数大汇总
    本文介绍了Android自定义控件绘图篇中的Paint函数大汇总,包括重置画笔、设置颜色、设置透明度、设置样式、设置宽度、设置抗锯齿等功能。通过学习这些函数,可以更好地掌握Paint的用法。 ... [详细]
  • 上图是InnoDB存储引擎的结构。1、缓冲池InnoDB存储引擎是基于磁盘存储的,并将其中的记录按照页的方式进行管理。因此可以看作是基于磁盘的数据库系统。在数据库系统中,由于CPU速度 ... [详细]
  • 本文介绍了使用readlink命令获取文件的完整路径的简单方法,并提供了一个示例命令来打印文件的完整路径。共有28种解决方案可供选择。 ... [详细]
author-avatar
mobiledu2502856653
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有