| 赞 | 8 |
| VIP | |
| 好人卡 | |
| 积分 | 24 |
| 经验 | |
| 最后登录 | 2022-11-9 |
| 在线时间 | 87 小时 |
- 梦石
- 0
- 星屑
- 2427
- 在线时间
- 87 小时
- 注册时间
- 2018-1-3
- 回帖
- 10
|
加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有账号?注册会员
×
本帖最后由 路路 于 2018-4-5 18:42 编辑
顾名思义...说通俗点就是抽奖 氪金 非洲概率,不过发布的小玩意和抽奖只有一毛钱关系(并没有现成的奖池给你抽)
用途就是从一组数据按对应的概率输出结果,软件默认的都是单个比较(掉落 事件的变量)x/n 要实现多种比较就稍微头疼了(非dalao)
泛用性还是挺高的 用于掉落阿奖池阿遇敌阿甚至能力值等等,以前好像发布过效率底下的版本,这次整合了两个版本 区别会在下面说明
[fold]
主体:
模块通用类:PICK_DATA_RATIOS.Normal() 适用于频繁更换数据的类型 百万次结果用时13秒左右
实例快速类:PICK_DATA_RATIOS::Rapid.new() 适用于固定数据的类型(也提供更改数据的set) 百万次结果用时0.6秒左右
兼容性:属于独立类型 理论上与默认和任何插件脚本没有冲突
容器是哈希对象 键就是数据本身 值即是概率数值,值的设定没有限制 会自动相加所有值 大小不分前后随意设置即可。
[pre lang="ruby"]#———————————————————————————————————————
# ●数据抽取(PICK_DATA_RATIOS) By.Lyaci
# use:type1-PICK_DATA_RATIOS.Normal(data)
# type2-PICK_DATA_RATIOS::Rapid.new(data) Rapid#set(data) Rapid#get
# data:Hash-{data=>odds}
#———————————————————————————————————————
module PICK_DATA_RATIOS
class Rapid
def initialize(data)
set(data)
end
def set(data)
@k,@v = data.keys,data.values
@m,@t = @v.inject(:+),Array.new
@v.each_with_index{|u,n|@t.concat Array.new(u,n)}
end
def get
c = @t[rand(@m)];return [@k[c],@v[c]]
end
end
def self.Normal(data = {})
k,v,z = data.keys,data.values,Array.new
m = v.inject(0){|a, b|c = a + b; z << c; c}
r = rand(m)
z.map!{|u|u>r}
i = z.index(true)
[k,v]
end
end[/pre]
测试:
[pre lang="ruby"]h={"金"=>5,"银"=>20,"钻石"=>1,"铁"=>50,"锡"=>20,"白金"=>4}
a={"金"=>0,"银"=>0,"钻石"=>0,"铁"=>0,"锡"=>0,"白金"=>0}
h2={"三等奖"=>5,"四等奖B"=>20,"一等奖"=>1,"安慰奖"=>50,"四等奖A"=>20,"二等奖"=>4}
a2={"三等奖"=>0,"四等奖B"=>0,"一等奖"=>0,"安慰奖"=>0,"四等奖A"=>0,"二等奖"=>0}
1000.times{
r=PICK_DATA_RATIOS.Normal(h)
a[r[0]]+=1
p r
}
p a
js = PICK_DATA_RATIOS::Rapid.new(h)
js2 = PICK_DATA_RATIOS::Rapid.new(h2)
p js.get
100.times{
r=js.get
a[r[0]]+=1
p r
}
p a
100.times{
r=js2.get
a2[r[0]]+=1
p r
}
p a2
h={"金"=>500,"银"=>20,"钻石"=>1,"铁"=>50,"锡"=>20,"白金"=>4}
js.set(h)
100.times{
r=js.get
a[r[0]]+=1
p r
}
p a[/pre]
[/fold] |
|