Project1
标题: 仿网游的不重复慨率抽奖, 显示慨率数量范例 [打印本页]
作者: ppspssss 时间: 2020-2-3 21:10
标题: 仿网游的不重复慨率抽奖, 显示慨率数量范例
本帖最后由 ppspssss 于 2024-8-20 13:38 编辑
这只是我的方法(已经很久之前),有其他方法请参考其他人更好的方法以替代的
之前群里有个人问我怎么做赛尔号随机抽奖,能从奖池中抽取, 随着奖池抽的慨率随之而增大, 网游中很多都是这样,而好像论坛搜索抽不到这种范例或方法, 想起来做起来也没这么简单, 那么就以我的方法做一次,那么就用5种口罩抽取作例子, 教程較易但依旧有一定难度,比較适用中等或有基础知識新手
要求会:數組慨念,for循環,以及全局變量使用等, 腳本中就插入相关的一个模块,隨时能調用抽獎, , 如有地方错請从中指出
制作前准备的慨念图思考:
腳本解釋:
范例附件(仅供参考)
抽奖范例.rar
(415.86 KB, 下载次数: 109)
作者: SailCat 时间: 2020-2-4 01:28
这功能完全就不需要那么复杂的脚本啊……
初始化奖池:
pool = [[1]*$N95, [2]*$普通, [3]*$医用, [4]*$其他]].flatten.sort {|a, b| rand()-rand()}
抽奖:
a = pool.pop
查看奖池比例:
size1 = pool.size - (pool - [1]).size # 还剩余的1的个数
rate1 = size1 / pool.size # 还剩余的1所占的比例
作者: SixRC 时间: 2020-2-4 05:03
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进一个数组 是不是不太好?
当然假如是很多个各不相同的东西
这个思路是没问题的
欢迎光临 Project1 (https://rpg.blue/) |
Powered by Discuz! X3.1 |