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

Project1

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

[已经解决] 求个优化的随机数算法

[复制链接]

Lv5.捕梦者

梦石
0
星屑
39009
在线时间
5716 小时
注册时间
2006-11-10
帖子
6618
跳转到指定楼层
1
发表于 2018-3-31 22:22:29 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
咱会用的随机写法就是rand  但是这个有个缺陷, 就是当它在循环调用的情况下, 随机出来的数值非常接近....



如图, 咱模仿火纹的升级系统, 升级时候的属性点根据成长度随机增加

然而, 尽管成长度不同, 只要一起升级, 那加点情况就几乎一样..... 多的时候一样多,少的时候一样少, 有区别的也就是几个成长度相差较大的属性........

  def up(actor)
    @f = []
    a = actor.maxhp成长 / 100
    b = actor.maxhp成长 % 100 > rand(20) + rand(80) ? 1:0
    @f.push(a+b)
    a = actor.atk成长 / 100
    b = actor.atk成长 % 100 > rand(30)+rand(70) ? 1:0
    @f.push(a+b)
    a = actor.maxsp成长 / 100
    b = actor.maxsp成长 % 100 > rand(70)+rand(30) ? 1:0
    @f.push(a+b)
    a = actor.pdef成长 / 100
    b = actor.pdef成长 % 100 > rand(45)+ rand(55) ? 1:0
    @f.push(a+b)
    a = actor.eva成长 / 100
    b = actor.eva成长 % 100 > rand(65)+rand(35) ? 1:0
    @f.push(a+b)
    a = actor.agi成长 / 100
    b = actor.agi成长 % 100 > rand(10)+rand(90) ? 1:0
    @f.push(a+b)
    a = actor.str成长 / 100
    b = actor.str成长 % 100 > rand(60)+rand(40) ? 1:0
    @f.push(a+b)
    a = actor.mdef成长 / 100
    b = actor.mdef成长 % 100 > rand(75)+rand(25) ? 1:0
    @f.push(a+b)
    a = actor.luk成长 / 100
    b = actor.luk成长 % 100 > rand(15)+rand(85) ? 1:0
    @f.push(a+b)
    a = actor.int成长 / 100
    b = actor.int成长 % 100 > rand(50)+rand(50) ? 1:0
    @f.push(a+b)
    a = actor.dex成长 / 100
    b = actor.dex成长 % 100 > rand(65)+rand(35) ? 1:0
    @f.push(a+b)
    @f.push(0)
  end

这个是我写的加点方法,  为了加大随机数 把 rand(100)拆成两份一起rand  但是效果并不大

有大大传授下更优化的随机数写法么?

Lv2.观梦者

梦石
0
星屑
910
在线时间
94 小时
注册时间
2005-10-22
帖子
397
2
发表于 2018-3-31 22:32:07 | 只看该作者
可以去下载我的魔力宝贝单机版,里边是有加点系统的,而且,随机的方法也在里边。
做脚本先从修改脚本做起,我只修改自己觉得能用到的东西。
以后的任何作品都将不会进行分享。
Bilibili:https://space.bilibili.com/288814521
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
39009
在线时间
5716 小时
注册时间
2006-11-10
帖子
6618
3
 楼主| 发表于 2018-3-31 22:34:24 | 只看该作者
ikki 发表于 2018-3-31 22:32
可以去下载我的魔力宝贝单机版,里边是有加点系统的,而且,随机的方法也在里边。 ...

额,不能麻烦下现场传授么? 因为网络不咋样的关系,下东西都巨慢....
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
910
在线时间
94 小时
注册时间
2005-10-22
帖子
397
4
发表于 2018-3-31 22:46:14 | 只看该作者
只有下载下来将我那个工程全部弄明白才会有很大的提升,还有就是作为从06年到现在的来说,看懂这个10年前的工程还是不成问题的。

点评

目测层主是小学三年级吧?! 05年注册的,13年了~~,貌似哪儿不对呀!  发表于 2018-4-1 17:27
RM的rand的取值问题比较坑,给你个思路,变量  发表于 2018-3-31 22:56
只是号老而已= =, 资质并不老, 弃坑N年, 最近想搞个同人才重拾RM, 到现在还离不开F1呢....  发表于 2018-3-31 22:51

评分

参与人数 1+1 收起 理由
灯笼菜刀王 + 1 我很赞同

查看全部评分

做脚本先从修改脚本做起,我只修改自己觉得能用到的东西。
以后的任何作品都将不会进行分享。
Bilibili:https://space.bilibili.com/288814521
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
39009
在线时间
5716 小时
注册时间
2006-11-10
帖子
6618
5
 楼主| 发表于 2018-3-31 22:54:19 | 只看该作者
ikki 发表于 2018-3-31 22:46
只有下载下来将我那个工程全部弄明白才会有很大的提升,还有就是作为从06年到现在的来说,看懂这个10年前的 ...

现在在尝试一个方法,  先生成一组0-100的随机数组,然后再随机提取其中一个作为种子...... 不知道这种方法效果如何

点评

RM的rand的取值问题比较坑,给你个思路,变量  发表于 2018-3-31 23:01
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
3582
在线时间
3065 小时
注册时间
2011-11-17
帖子
980
6
发表于 2018-3-31 23:01:31 | 只看该作者
每次循环种子变更 比如以当前时间/i 作为种子

点评

GOOD, 感谢提供思路  发表于 2018-3-31 23:02

评分

参与人数 1+1 收起 理由
灯笼菜刀王 + 1 认可答案

查看全部评分

回复 支持 反对

使用道具 举报

Lv5.捕梦者 (版主)

遠航の猫咪

梦石
3
星屑
23186
在线时间
2387 小时
注册时间
2005-10-15
帖子
1166

开拓者

7
发表于 2018-4-1 10:27:40 | 只看该作者
rand (65) + rand(35)这写法真是亮瞎了……

理论上讲rand(65)+rand(35)的期望值和rand(10)+rand(90)以及rand(100)一样,都是50……

点评

快去洗下眼睛吧@_@  发表于 2018-4-1 11:08
SailCat (小猫子·要开心一点) 共上站 24 次,发表过 11 篇文章 上 次 在: [2006年01月28日11:41:18 星期六] 从 [162.105.120.91] 到本站一游。
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
39009
在线时间
5716 小时
注册时间
2006-11-10
帖子
6618
8
 楼主| 发表于 2018-4-1 11:11:13 | 只看该作者
SailCat 发表于 2018-4-1 10:27
rand (65) + rand(35)这写法真是亮瞎了……

理论上讲rand(65)+rand(35)的期望值和rand(10)+rand(90)以及ra ...

因为不知道rand的的工作原理, 猜想如果是使用乱数的话,那多rand几次就能多消耗几个乱数, 借此增加随机出来的范围咯
回复 支持 反对

使用道具 举报

Lv5.捕梦者 (版主)

梦石
1
星屑
23994
在线时间
3339 小时
注册时间
2011-7-8
帖子
3926

开拓者

9
发表于 2018-4-1 11:52:48 | 只看该作者
本帖最后由 guoxiaomi 于 2018-4-1 11:53 编辑
  1. #--------------------------------------------------
  2. # Net_Rand
  3. #--------------------------------------------------
  4. class Net_Rand
  5.   def initialize(seed = '0000')
  6.     reset(seed)
  7.   end

  8.   def update(i = nil)
  9.     @result = Zlib::crc32((@seed ^ @result).to_s(16))
  10.     return (i ? @result * i : @result.to_f) / (1 << 32)
  11.   end

  12.   def reset(seed = '0000')
  13.     @seed = Zlib::crc32(seed.to_s)
  14.     @result = 0
  15.   end
  16. end
复制代码

当年为了伪随机同步随便写了个,反正肯定没有直接srand,rand靠谱,你可以参考一下思路。

点评

zlibcrc的方法实现随机,效果还是可以的,就是会略微有一点点的运算延迟,不过,一般是感觉不出来的。  发表于 2018-4-1 12:17

评分

参与人数 1+1 收起 理由
灯笼菜刀王 + 1 精品文章

查看全部评分

熟悉rgss和ruby,xp区版主~
正在填坑:《膜拜组传奇》讲述膜拜组和学霸们的故事。
已上steam:与TXBD合作的Reformers《变革者》
* 战斗调用公共事件 *
* RGSOS 网络脚本 *
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
39009
在线时间
5716 小时
注册时间
2006-11-10
帖子
6618
10
 楼主| 发表于 2018-4-1 13:11:31 | 只看该作者
guoxiaomi 发表于 2018-4-1 11:52
当年为了伪随机同步随便写了个,反正肯定没有直接srand,rand靠谱,你可以参考一下思路。 ...

非常感谢, 不过,有看没有懂....  知道其然而不知其所以然......

位运算这个等级对咱来说还是太高端了些......

咱目前是用一堆没有逻辑概念的变量乱七八糟的海算一通,然后筛选适合的数值塞到一个数组里...  然后循环rand一个出来, 只要它和前面抽的数差距在10以外, 就return出来当做结果......

点评

还是 a = Net_Rand.new(100) if a < n ?  发表于 2018-4-1 16:19
↓ 不懂意思就不知道怎么用了啊- -, if Net_Rand(100) < n ?  发表于 2018-4-1 16:17
直接用就行,不用管那么多  发表于 2018-4-1 16:06
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-13 15:30

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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