Project1

标题: 求个优化的随机数算法 [打印本页]

作者: 灯笼菜刀王    时间: 2018-3-31 22:22
标题: 求个优化的随机数算法
咱会用的随机写法就是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  但是效果并不大

有大大传授下更优化的随机数写法么?
作者: ikki    时间: 2018-3-31 22:32
可以去下载我的魔力宝贝单机版,里边是有加点系统的,而且,随机的方法也在里边。
作者: 灯笼菜刀王    时间: 2018-3-31 22:34
ikki 发表于 2018-3-31 22:32
可以去下载我的魔力宝贝单机版,里边是有加点系统的,而且,随机的方法也在里边。 ...

额,不能麻烦下现场传授么? 因为网络不咋样的关系,下东西都巨慢....
作者: ikki    时间: 2018-3-31 22:46
只有下载下来将我那个工程全部弄明白才会有很大的提升,还有就是作为从06年到现在的来说,看懂这个10年前的工程还是不成问题的。
作者: 灯笼菜刀王    时间: 2018-3-31 22:54
ikki 发表于 2018-3-31 22:46
只有下载下来将我那个工程全部弄明白才会有很大的提升,还有就是作为从06年到现在的来说,看懂这个10年前的 ...

现在在尝试一个方法,  先生成一组0-100的随机数组,然后再随机提取其中一个作为种子...... 不知道这种方法效果如何
作者: yagami    时间: 2018-3-31 23:01
每次循环种子变更 比如以当前时间/i 作为种子
作者: SailCat    时间: 2018-4-1 10:27
rand (65) + rand(35)这写法真是亮瞎了……

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

作者: 灯笼菜刀王    时间: 2018-4-1 11:11
SailCat 发表于 2018-4-1 10:27
rand (65) + rand(35)这写法真是亮瞎了……

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

因为不知道rand的的工作原理, 猜想如果是使用乱数的话,那多rand几次就能多消耗几个乱数, 借此增加随机出来的范围咯
作者: guoxiaomi    时间: 2018-4-1 11:52
本帖最后由 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靠谱,你可以参考一下思路。
作者: 灯笼菜刀王    时间: 2018-4-1 13:11
guoxiaomi 发表于 2018-4-1 11:52
当年为了伪随机同步随便写了个,反正肯定没有直接srand,rand靠谱,你可以参考一下思路。 ...

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

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

咱目前是用一堆没有逻辑概念的变量乱七八糟的海算一通,然后筛选适合的数值塞到一个数组里...  然后循环rand一个出来, 只要它和前面抽的数差距在10以外, 就return出来当做结果......
作者: guoxiaomi    时间: 2018-4-2 10:12
灯笼菜刀王 发表于 2018-4-1 13:11
非常感谢, 不过,有看没有懂....  知道其然而不知其所以然......

位运算这个等级对咱来说还是太 ...

  1. $rand = Net_Rand.new(Time.now.to_f)
  2. $rand.update # => 0~1之间的随机小数
  3. $rand.update(100) # => 0~99之间的随机整数
  4. $rand.reset(Time.now.to_f) # => 利用当前时间重置随机数种子
复制代码

作者: 灯笼菜刀王    时间: 2018-4-2 11:04
guoxiaomi 发表于 2018-4-2 10:12

非常感谢, 我试试看~




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1