热门标签 | 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函数将所写的程序包装成函数。


推荐阅读
  • 本文探讨了如何通过预处理器开关选择不同的类实现,并解决在特定情况下遇到的链接器错误。 ... [详细]
  • 本文介绍如何从字符串中移除大写、小写、特殊、数字和非数字字符,并提供了多种编程语言的实现示例。 ... [详细]
  • 本文探讨了如何在Classic ASP中实现与PHP的hash_hmac('SHA256', $message, pack('H*', $secret))函数等效的哈希生成方法。通过分析不同实现方式及其产生的差异,提供了一种使用Microsoft .NET Framework的解决方案。 ... [详细]
  • 本文探讨了如何利用HTML5和JavaScript在浏览器中进行本地文件的读取和写入操作,并介绍了获取本地文件路径的方法。HTML5提供了一系列API,使得这些操作变得更加简便和安全。 ... [详细]
  • 本文将详细探讨 Java 中提供的不可变集合(如 `Collections.unmodifiableXXX`)和同步集合(如 `Collections.synchronizedXXX`)的实现原理及使用方法,帮助开发者更好地理解和应用这些工具。 ... [详细]
  • 本文探讨了如何使用pg-promise库在PostgreSQL中高效地批量插入多条记录,包括通过事务和单一查询两种方法。 ... [详细]
  • 本文介绍 SQL Server 的基本概念和操作,涵盖系统数据库、常用数据类型、表的创建及增删改查等基础操作。通过实例帮助读者快速上手 SQL Server 数据库管理。 ... [详细]
  • 深入理解Vue.js:从入门到精通
    本文详细介绍了Vue.js的基础知识、安装方法、核心概念及实战案例,帮助开发者全面掌握这一流行的前端框架。 ... [详细]
  • #print(34or4 ... [详细]
  • 本文详细介绍了一种通过MySQL弱口令漏洞在Windows操作系统上获取SYSTEM权限的方法。该方法涉及使用自定义UDF DLL文件来执行任意命令,从而实现对远程服务器的完全控制。 ... [详细]
  • 本文介绍如何在MySQL中创建一个自定义函数,用于将包含多个班级编号的字符串拆分为对应的班级名称。通过详细解释代码逻辑和功能,帮助读者理解并应用这一技术。 ... [详细]
  • 在编译BSP包过程中,遇到了一个与 'gets' 函数相关的编译错误。该问题通常发生在较新的编译环境中,由于 'gets' 函数已被弃用并视为安全漏洞。本文将详细介绍如何通过修改源代码和配置文件来解决这一问题。 ... [详细]
  • 优化SQL Server批量数据插入存储过程的实现
    本文介绍了一种改进的SQL Server存储过程,用于生成批量插入语句。该方法不仅提高了性能,还支持单行和多行模式,适用于SQL Server 2005及以上版本。 ... [详细]
  • 本文详细探讨了Java中的ClassLoader类加载器的工作原理,包括其如何将class文件加载至JVM中,以及JVM启动时的动态加载策略。文章还介绍了JVM内置的三种类加载器及其工作方式,并解释了类加载器的继承关系和双亲委托机制。 ... [详细]
  • java文本编辑器,java文本编辑器设计思路
    java文本编辑器,java文本编辑器设计思路 ... [详细]
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社区 版权所有