Project1

标题: 关于“随机”率的问题 [打印本页]

作者: 菜鸟飞呀飞    时间: 2011-6-4 04:33
提示: 作者被禁止或删除 内容自动屏蔽
作者: 忧雪の伤    时间: 2011-6-4 10:35
本帖最后由 忧雪の伤 于 2011-6-4 10:39 编辑
  1. random = 0
  2. array = [[1, 20], [2, 30], [3, 50]]
  3. array.size.times{|index|random += array[index][1]}
  4. array.each{|index|(print index[0];  break) if index[1] > rand(random) + 1}
复制代码

作者: 后知后觉    时间: 2011-6-4 12:54
  1. ary = [[1,15],[2,70],[3,40],[4,20],[5,75],[6,55],[7,45],[8,66],[9,70]]
  2. random = rand(100)
  3. temp = []
  4. ary.each{|item|temp.push(item) if item[1] > random}
  5. result = temp[rand([temp.size, 1].max)]
  6. temp.sort!{|a,b|b[1] - a[1]}
  7. p random,temp,result,temp[0]
  8. exit
复制代码

作者: 禾西    时间: 2011-6-4 13:21
本帖最后由 禾西 于 2011-6-4 13:21 编辑

  1. ary = [[1,15],[2,70],[3,40],[4,20],[5,75],[6,55],[7,45],[8,66],[9,70]]
  2. sum = 0
  3. ary.each{|item|sum += item[1]}
  4. weight = rand(sum)
  5. index = 0
  6. ary.each do |item|
  7.   weight -= item[1]
  8.   if weight < 0
  9.     p index
  10.     break
  11.   else
  12.     index += 1
  13.   end
  14. end
复制代码
rand消耗時間很多的- -,可以少用盡量少用……
作者: 忧雪の伤    时间: 2011-6-4 14:01
本帖最后由 忧雪の伤 于 2011-6-4 15:07 编辑
  1. def random(*args)
  2.   return unless args.size == 2 or args[0].all?{|item|item.size == 2}
  3.   args[1] ||= 100;  value = [args[1], nil]
  4.   args[0].each{|item|(value[1] = item[0];  break) if item[1] > rand(value[0])}
  5.   return value[1] unless value[1].nil?
  6.   return args[0][rand(args[0].size)][0]
  7. end

  8. 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