Project1
标题:
关于“随机”率的问题
[打印本页]
作者:
菜鸟飞呀飞
时间:
2011-6-4 04:33
提示:
作者被禁止或删除 内容自动屏蔽
作者:
忧雪の伤
时间:
2011-6-4 10:35
本帖最后由 忧雪の伤 于 2011-6-4 10:39 编辑
random = 0
array = [[1, 20], [2, 30], [3, 50]]
array.size.times{|index|random += array[index][1]}
array.each{|index|(print index[0]; break) if index[1] > rand(random) + 1}
复制代码
作者:
后知后觉
时间:
2011-6-4 12:54
ary = [[1,15],[2,70],[3,40],[4,20],[5,75],[6,55],[7,45],[8,66],[9,70]]
random = rand(100)
temp = []
ary.each{|item|temp.push(item) if item[1] > random}
result = temp[rand([temp.size, 1].max)]
temp.sort!{|a,b|b[1] - a[1]}
p random,temp,result,temp[0]
exit
复制代码
作者:
禾西
时间:
2011-6-4 13:21
本帖最后由 禾西 于 2011-6-4 13:21 编辑
ary = [[1,15],[2,70],[3,40],[4,20],[5,75],[6,55],[7,45],[8,66],[9,70]]
sum = 0
ary.each{|item|sum += item[1]}
weight = rand(sum)
index = 0
ary.each do |item|
weight -= item[1]
if weight < 0
p index
break
else
index += 1
end
end
复制代码
rand消耗時間很多的- -,可以少用盡量少用……
作者:
忧雪の伤
时间:
2011-6-4 14:01
本帖最后由 忧雪の伤 于 2011-6-4 15:07 编辑
def random(*args)
return unless args.size == 2 or args[0].all?{|item|item.size == 2}
args[1] ||= 100; value = [args[1], nil]
args[0].each{|item|(value[1] = item[0]; break) if item[1] > rand(value[0])}
return value[1] unless value[1].nil?
return args[0][rand(args[0].size)][0]
end
print random([[1, 20], [2, 30], [3, 50]], 100)
复制代码
作者:
菜鸟飞呀飞
时间:
2011-6-4 14:24
提示:
作者被禁止或删除 内容自动屏蔽
作者:
后知后觉
时间:
2011-6-4 14:24
本帖最后由 后知后觉 于 2011-6-4 14:30 编辑
我写的那段代码的原理是先获取一个随机值 random
然后对源数组 ary 的内容逐一进行判断.
当其几率大于这个随机值的时候.就把其放进一个临时的数组 temp 里.
然后获取 temp 数组里的随机一个作为最终结果 result.
至于后面的 temp.sort! 是在对这些东西进行排序.
根据他们的几率从大到小排序.
而 temp[0] 就是在获取这些东西里几率最大的一个.
不过用each对temp循环获取最大的几率项可能比用sort更快些?
我偷懒了= =.
也可以在对ary进行each的时候就可以得到满足条件的最大几率项.这样就少了一次循环.
作者:
菜鸟飞呀飞
时间:
2011-6-4 14:35
提示:
作者被禁止或删除 内容自动屏蔽
作者:
菜鸟飞呀飞
时间:
2011-6-4 15:28
提示:
作者被禁止或删除 内容自动屏蔽
欢迎光临 Project1 (https://rpg.blue/)
Powered by Discuz! X3.1