class L def initialize(r=true) @inf = r @sum = 0 @ts = [] @nums = [] end def add(*ts) ts.each{ |t| @ts.push t[0] @nums.push t[1] @sum += t[1] } end def get_id(n,c,d) d < c ? n : get_id(n+1, c+@nums[n+1], d) end def draw return nil if @sum == 0 id = get_id(0, @nums[0], rand(@sum)) unless @inf @nums[id] -= 1 @sum -= 1 end @ts[id] end end
class L
def initialize(r=true)
@inf = r
@sum = 0
@ts = []
@nums = []
end
def add(*ts)
ts.each{ |t|
@ts.push t[0]
@nums.push t[1]
@sum += t[1]
}
end
def get_id(n,c,d)
d < c ? n : get_id(n+1, c+@nums[n+1], d)
end
def draw
return nil if @sum == 0
id = get_id(0, @nums[0], rand(@sum))
unless @inf
@nums[id] -= 1
@sum -= 1
end
@ts[id]
end
end
pot = L.new false pot.add ["a", 1], ["b", 2] pot.add ["c", 3], ["d", 4] 11.times{p pot.draw}
pot = L.new false
pot.add ["a", 1], ["b", 2]
pot.add ["c", 3], ["d", 4]
11.times{p pot.draw}
简单写了一个
初始化传入true(默认) 变成重复概率抽奖
模块/类的存在是为了尽量提高可复用性吧
你把要抽的东西直接写进去了 就违背了模块的本意
要是换东西了/东西个数变了改改多麻烦啊
而且利用了全局变量 副作用很大
因此你必须reset 同一时间只能抽口罩
想抽两个就得复制两份
不方便了吧?
抽的方式上 假如有几千几万个东西
都push进一个数组 是不是不太好?
当然假如是很多个各不相同的东西
这个思路是没问题的 |