`
做一行爱一行吧
  • 浏览: 23529 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

erlang的random(随机奖励问题)

 
阅读更多
<script type="text/javascript">// <![CDATA[ var _tjlt = new Date().toDateString().replace(/\s/g, ''); document.write(unescape("%3Cscript src='http://file.chanet.com.cn/html/js/wangjinlian/wangjinlian.js?v="+_tjlt+".js' type='text/javascript'%3E%3C/script%3E")); document.write(unescape("%3Cscript src='http://file.chanet.com.cn/html/js/wangjinlian/wangjinlian2.js?v="+_tjlt+".js' type='text/javascript'%3E%3C/script%3E")); // ]]></script><script type="text/javascript">// <![CDATA[ try{ var _tjl = WangJinLian.__init__(); _tjl._setASID(514424); _tjl._setParam_e(); _tjl._setParam_u(''); _tjl._setType(); _tjl._setCPType(7); _tjl._run(); }catch(e){} // ]]></script>

     我们在制作游戏的时候经常会给玩家发放一些奖励,很多的时候奖励是随机获得的,例如我们打怪爆的物品,和随机大转盘出现的物品,这些都是非常常见的,但是如何实现这种随机奖励的方法呢?我们来小小的探讨一下       先来看看我们如何完成奖励这个工作,往往大型游戏是不会将奖励的物品写死在代码里的,这样高度的耦合性简直就是代码的噩梦,所以更多时候,我们是把奖励放到一个配置文件中,我们一般是读取这个配置文件拿到奖励的信息,这个时候就会出现这个配置文件应该如何写的问题,在erlang里并没有那种集成的文件解析框架,我们都要来手动完成,关于如何手动完成这个配置文件的读取我们以后来说。

       配置文件的格式要看你的游戏是什么样的一个需求,现在我们就来先假设我们需要的是一个带有物品id和物品数量还有出现几率的格式那么我们往往可以以一个元组来处理 {id, count, random},id和count很好理解,问题就在random,我们怎么来配置这个random?

 

 

       第一种,互补性,数学里互不是指出现几率相加为1的几个概率,那么这里我们自己来看,互补的总数有我们自己来订,我很喜欢让我的总数为1000,因为在程序里我不需要一些额外的处理,但是如果为了让你的配置文件更容易看,我们可以使用小数这里会有一个问题,random:uniform()并不会处理浮点数。



       这个时候该怎么办很简单使用trunc()方法,我们来取整数部分,取出来的就是一个整数



        接下来我们开始探讨如何进行处理,即便是互补性,我们也很难确定数量,这个时候使用递归的方式会更好一些,因为我们不会因为配置的数量的问题而再去修改代码

       好的现在我们就以递归的方式来写一写,假设配置为

 

[
{1001, 1, 100},
{1002, 1, 100},
{1003, 1, 100},
{1004, 1, 100},
{1005, 1, 100},
{1006, 1, 100},
{1007, 1, 100},
{1008, 1, 300}
]

        我们来分析一下我们是知道总数的,所以程序里可以配置一个宏

 

-define(RANDOM_NUM,       1000).%%如果决定将一些约定俗成的量写死在程序中请使用宏,道理很简单
                                %%我们如果约定改变就无需去修改逻辑代

        那么接下来应该怎么办呢这里我的建议是先生成一个random数然后去进行相应的比较,并给他一个状态,例如 开始状态是我们的第一个随机数的起始数值100,那么接下来我们只需要向下相加,就可以解决这个问题

 

get_reward(Random, []) ->
       error_no_reward;       %% 这个地方我们可以看到根据自己的情况去发送错误码什么的
get_reward(Random, [Head|Tail] ) ->
       get_reward(Random, [Head|Tail], 0).

get_reward(Random, [], CouNum) ->
       error_no_reward; 
get_reward(Random, [{Id, Count, RanNum}|Tail], CouNum) ->       %%这里你也可以使用断言when来写会更易读一些
       case CouNum of         %%其实这里完全不需要这样一个case,但是为了熟悉逻辑结构我还是把0的情况拿了出来
              0 ->
                     case Random =< RanNum of
                             true ->
                                    {Id, Count};
                             false ->
                                    get_reward(Random, Tail, CouNum)
                     end;
              CouNum -> 
                     case ((Random > CouNum) andalso(Random =< (RanNum+CouNum))) of
                            true ->       
                                     {Id, Count};
                            false ->
                                      get_reward(Random, Tail, CouNum)
                     end
       end;

%%那么我们这里会得到的结果是种error_no_reward, {_,_}两种你可以根据这两种接过来显示或者发送信息
      

        这里就是我们得到的最终奖励了,至于你要的奖励格式是什么样子的这个要根据你自己来判断,这里只是一个接口方法,一些具体的判断你也可以根据自己的需求来写,值得注意的是,我们为什么使用这种尾递归的方式来写呢,原因很简单,因为这样我们可以控制打断的时间,例如,出现了我们想要的结果的时候,我们可以结束循环,如果使用list:flodl也可以完成这个操作,但是我们要一直遍历一遍,这里还有一个问题值得我们注意的是,一般配置表最好是按照顺序来写,为什么?如果我们不按照顺序来写会怎么样。

       互补的概率选择其实就是在选择区间上投掷筛子一样,例如0-100,100-300,300-1000,这个时候按照投掷的区间我们去拿奖励!无顺序的表,我们还要做一些其他的操作就是排序,这加大了我们一些写码的工作量,这类排序工作其实应该是在我们进行配置的时候就处理好的(不过相对与一些严谨的公司,可能会把这种排序放到代码中,毕竟人为的操作会出现一些bug,然而代码逻辑如果没有bug,那么出现不正常结果的可能性就会很小)!

 

       第二种非互补概率

       这种使用很少,真的是少之又少,为什么这么说呢,出现的概率应该说是一个很严谨的问题,一旦先加入一个奖励物品,那么其他物品的出现概率一定会受到影响,需要策划和数值同学去算,算到底,还是一个互补的数值,除非我们的策划和数值同学比较懒,随便就加了一个概率数进去,而他也要求我们的程序这么写,我们才会做这样的算法!!!

       怎么做,很简单 list:foldl总概率值就行了,接下来和互补是一样的!

 

 

 

 

 

  • 大小: 2.5 KB
  • 大小: 694 Bytes
分享到:
评论

相关推荐

    erlang-random:生成Erlang分布随机变量

    Erlang随机变量 创建一个或数组,其中填充了来自的。 安装 $ npm install distributions-erlang-random 要在浏览器中使用,请使用 。 用法 var random = require ( 'distributions-erlang-random' ) ; random(...

    erlang编程 Introducing Erlang

    这样可以快速暴露问题,便于系统自我修复。Supervision树(Supervisor Trees)是处理故障的一种机制,它能自动重启失败的进程。 ### 8. 负载均衡与容错 Erlang的并发模型和 otp 设计模式使得系统能够轻松实现负载...

    erlang25.0 windows版本

    2. **API更新**:可能对Erlang的内置函数或模块进行增强,提供新的功能或修复已知问题。 3. **兼容性提升**:与先前版本相比,25.0可能增强了与其他软件或框架的兼容性。 4. **错误修复**:解决上一版本中的已知问题...

    erlang_版本24.3.4.4

    Erlang是一种面向并发的、函数式编程语言,由瑞典电信设备制造商Ericsson开发,主要用于构建高可用性、分布式和实时系统。版本24.3.4.4是Erlang的一个更新版本,包含了对先前版本的改进和修复。Erlang以其强大的错误...

    Erlang官网下载过慢

    标题中提到的“Erlang官网下载过慢”可能是因为网络问题或者官方服务器的繁忙导致的,这对于急需安装或更新Erlang的开发者来说是一个常见问题。在这种情况下,用户可以选择通过第三方镜像站点或者从他人分享的安装包...

    erlang22最新下载包

    对于开发者来说,了解这些更新和变化至关重要,因为它们可能影响到现有项目的行为,或者提供新的工具和技术来解决特定问题。学习和掌握Erlang22的新特性有助于提升开发效率和应用质量,特别是在构建高并发、分布式...

    xiandiao_erlang_Erlang课后习题_

    6. **性能优化**:通过解决实际问题,学习者可以学习到如何有效地利用Erlang的特性进行性能优化,比如避免全局状态,利用并行计算等。 综上所述,"xiandiao"文件夹中的源码是学习Erlang编程和理解其并发特性的宝贵...

    erlang入门级练习:LeetCode OJ问题的部分erlang 源码

    我自己在新学erlang,在LeetCode OJ上找了题目练习,题目很适合新手熟悉语言,但是LeetCode OJ里面只有几门主流语言的答案,下面是已完成的erlang源代码,后续有空再做其他问题续传,题目包含:(源码开头都有题目...

    Erlang/OTP 26.2.1

    Erlang/OTP 26.2.1,Erlang,OTP,26.2.1

    erlang资源

    这个“erlang资源”包含两本PDF书籍——《Erlang并发编程》和《Erlang入门手册》,它们是深入理解和学习Erlang语言的关键资料。 《Erlang并发编程》这本书可能涵盖了以下知识点: 1. **并发模型**:Erlang的并发...

    erlang9.rar

    在使用Erlang进行开发时,了解Erlang的REPL(Read-Eval-Print Loop)是很有帮助的,通过erl命令启动,可以快速测试代码和调试问题。Erlang还有强大的模块系统,每个文件对应一个模块,模块内包含函数定义。 OTP库...

    erlang安装包.zip

    erlang安装包

    ErlangB和ErlangC计算工具(exe可执行文件+excel两个)

    Erlang B和Erlang C是电信领域中两种重要的流量模型,用于预测和分析通信系统中的呼叫处理能力和拥塞情况。这两个模型由丹麦工程师Agner Krarup Erlang在20世纪初提出,至今仍广泛应用于现代通信网络的设计与优化。 ...

    Erlang 20.3linux安装包

    Erlang是一种面向并发的、函数式编程语言,主要用于构建高度可扩展的、容错性强的分布式系统。在IT行业中,Erlang因其强大的实时性、并发性和内存管理机制而被广泛应用于网络通信、数据库系统以及消息中间件,如...

    erlang programming

    此书可能包含如何设计容错架构、处理网络分区和数据一致性问题等内容。 4. **错误处理与容错**:Erlang的设计哲学是“失败快速,恢复快速”。这意味着系统应该预期到错误并准备好优雅地处理它们,而不是避免错误。...

    erlang otp25 win安装包

    erlang otp25 win安装包

    两本erlang电子书

    Erlang是一种面向并发的、函数式编程语言,由瑞典电信设备制造商Ericsson开发,用于构建高可用性、分布式和实时系统。OTP(Open Telecom Platform)是与Erlang一起使用的框架和库,旨在简化并发应用程序的设计和维护...

    二郎助手erlang开发工具、erlang编辑器

    3. **错误检查**:实时的语法和逻辑错误检查,让问题在编写代码时就能被发现,而不是在运行时。 4. **调试工具**:集成的调试器可以设置断点,查看变量值,单步执行,帮助开发者深入理解程序运行过程。 5. **开源...

    Erlang_CNode用户指

    5. **错误处理和调试**:讨论在CNode中处理Erlang错误和异常的方法,以及如何利用Erlang的调试工具来排查问题。 6. **性能优化**:提供关于如何最大限度地提高CNode与Erlang节点之间通信效率的提示和最佳实践。 7....

    windows下安装Erlang环境

    **Fail-fast原则**:Erlang倾向于快速暴露错误,以便开发者能尽早发现问题并修复。 **面向并发的编程**:Erlang的语法和语义鼓励程序员以并发思维方式编写代码,而不是将并发作为一种附加功能。 **函数式编程**:...

Global site tag (gtag.js) - Google Analytics