设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 1752|回复: 8
打印 上一主题 下一主题

[已经解决] 关于“随机”率的问题

 关闭 [复制链接]
菜鸟飞呀飞 该用户已被删除
跳转到指定楼层
1
发表于 2011-6-4 04:33:24 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
提示: 作者被禁止或删除 内容自动屏蔽
菜鸟飞呀飞 该用户已被删除
9
 楼主| 发表于 2011-6-4 15:28:45 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

菜鸟飞呀飞 该用户已被删除
8
 楼主| 发表于 2011-6-4 14:35:07 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
6860
在线时间
1666 小时
注册时间
2008-10-29
帖子
6710

贵宾

7
发表于 2011-6-4 14:24:37 | 只看该作者
本帖最后由 后知后觉 于 2011-6-4 14:30 编辑

我写的那段代码的原理是先获取一个随机值 random
然后对源数组 ary 的内容逐一进行判断.
当其几率大于这个随机值的时候.就把其放进一个临时的数组 temp 里.
然后获取 temp 数组里的随机一个作为最终结果 result.
至于后面的 temp.sort! 是在对这些东西进行排序.
根据他们的几率从大到小排序.
而 temp[0] 就是在获取这些东西里几率最大的一个.
不过用each对temp循环获取最大的几率项可能比用sort更快些?
我偷懒了= =.
也可以在对ary进行each的时候就可以得到满足条件的最大几率项.这样就少了一次循环.

点评

这样 几率 小的 被选中 好像没希望拉?  发表于 2011-6-4 14:44

评分

参与人数 1星屑 +400 梦石 +2 收起 理由
「旅」 + 400 + 2

查看全部评分












你知道得太多了

回复 支持 反对

使用道具 举报

菜鸟飞呀飞 该用户已被删除
6
 楼主| 发表于 2011-6-4 14:24:03 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

Lv2.观梦者

虚構歪曲

梦石
0
星屑
364
在线时间
1198 小时
注册时间
2010-12-18
帖子
3928

贵宾

5
发表于 2011-6-4 14:01:16 | 只看该作者
本帖最后由 忧雪の伤 于 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 21:58
每个元素?  发表于 2011-6-4 15:31
测试了10来此 几率各占一半 O_O  发表于 2011-6-4 15:22
忘记改了恩……  发表于 2011-6-4 15:01
random 这个你打算定做啥? 脚本错误 =_ <  发表于 2011-6-4 14:58

评分

参与人数 1星屑 +400 梦石 +2 收起 理由
「旅」 + 400 + 2

查看全部评分

回复 支持 反对

使用道具 举报

Lv3.寻梦者

酱油的

梦石
0
星屑
1035
在线时间
2161 小时
注册时间
2007-12-22
帖子
3271

贵宾

4
发表于 2011-6-4 13:21:02 | 只看该作者
本帖最后由 禾西 于 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消耗時間很多的- -,可以少用盡量少用……

点评

誰說被無視O O。0.1%的幾率也是幾率呀  发表于 2011-6-4 14:20
所以说是不是要一直random?  发表于 2011-6-4 14:08
这样貌似可以 但是有多个几率高的 几率低的直接被无视了…  发表于 2011-6-4 14:06
第一次計算抽取幾率的水平,第二次從高于隨機幾率的數組中平均抽取,結果可能產生nil值...如果第一抽抽中40,那麼幾率45,50,或者60都沒有任何分別  发表于 2011-6-4 13:47
为啥就是看不懂后知后觉前辈的呢……  发表于 2011-6-4 13:36

评分

参与人数 1星屑 +400 梦石 +2 收起 理由
「旅」 + 400 + 2

查看全部评分

不做頭像做簽名,看我囧冏有神(多謝山人有情提供 )
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
6860
在线时间
1666 小时
注册时间
2008-10-29
帖子
6710

贵宾

3
发表于 2011-6-4 12:54:02 | 只看该作者
  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
复制代码

点评

temp.sort!{|a,b|b[1] - a[1]} 为什么一次返回全部temp 一次返回[]??  发表于 2011-6-4 13:55











你知道得太多了

回复 支持 反对

使用道具 举报

Lv2.观梦者

虚構歪曲

梦石
0
星屑
364
在线时间
1198 小时
注册时间
2010-12-18
帖子
3928

贵宾

2
发表于 2011-6-4 10:35:58 | 只看该作者
本帖最后由 忧雪の伤 于 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}
复制代码

点评

其实本来是写成100的恩……  发表于 2011-6-4 13:58
测试了下 你写的random是几分比吧 这里是把每个单元的几率+在一起么? 这样 大量单元岂不会…… 而且有时rand时一个单元都没选中呢  发表于 2011-6-4 13:43
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-29 19:40

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表