设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 2710|回复: 2
打印 上一主题 下一主题

[原创发布] 仿网游的不重复慨率抽奖, 显示慨率数量 ,較中等简易范例

[复制链接]

Lv4.逐梦者

梦石
0
星屑
13559
在线时间
2753 小时
注册时间
2014-10-4
帖子
756

R考场第七期纪念奖

1
发表于 2020-2-4 05:03:06 | 显示全部楼层
RUBY 代码复制
  1. class L
  2.   def initialize(r=true)
  3.     @inf = r
  4.     @sum = 0
  5.     @ts = []
  6.     @nums = []
  7.   end
  8.   def add(*ts)
  9.     ts.each{ |t|
  10.       @ts.push t[0]
  11.       @nums.push t[1]
  12.       @sum += t[1]
  13.     }
  14.   end
  15.   def get_id(n,c,d)
  16.     d < c ? n : get_id(n+1, c+@nums[n+1], d)
  17.   end
  18.   def draw
  19.     return nil if @sum == 0
  20.     id = get_id(0, @nums[0], rand(@sum))
  21.     unless @inf
  22.       @nums[id] -= 1
  23.       @sum -= 1
  24.     end
  25.     @ts[id]
  26.   end
  27. end

RUBY 代码复制
  1. pot = L.new false
  2. pot.add ["a", 1], ["b", 2]
  3. pot.add ["c", 3], ["d", 4]
  4. 11.times{p pot.draw}

简单写了一个
初始化传入true(默认) 变成重复概率抽奖

模块/类的存在是为了尽量提高可复用性吧
你把要抽的东西直接写进去了 就违背了模块的本意
要是换东西了/东西个数变了改改多麻烦啊
而且利用了全局变量 副作用很大
因此你必须reset 同一时间只能抽口罩
想抽两个就得复制两份
不方便了吧?

抽的方式上 假如有几千几万个东西
都push进一个数组 是不是不太好?
当然假如是很多个各不相同的东西
这个思路是没问题的
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-5-8 23:45

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表