求个优化的随机数算法

查看数: 6374 | 评论数: 11 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2018-3-31 22:22

正文摘要:

咱会用的随机写法就是rand  但是这个有个缺陷, 就是当它在循环调用的情况下, 随机出来的数值非常接近.... 如图, 咱模仿火纹的升级系统, 升级时候的属性点根据成长度随机增加 然而, 尽管成长度不同, ...

回复

灯笼菜刀王 发表于 2018-4-2 11:04:48

非常感谢, 我试试看~
guoxiaomi 发表于 2018-4-2 10:12:24
灯笼菜刀王 发表于 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) # => 利用当前时间重置随机数种子
复制代码

评分

参与人数 2星屑 +100 赞 +2 收起 理由
RyanBern + 100 + 1 被醋瞎
灯笼菜刀王 + 1 认可答案

查看全部评分

灯笼菜刀王 发表于 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
guoxiaomi 发表于 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 精品文章

查看全部评分

灯笼菜刀王 发表于 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几次就能多消耗几个乱数, 借此增加随机出来的范围咯
SailCat 发表于 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
yagami 发表于 2018-3-31 23:01:31
每次循环种子变更 比如以当前时间/i 作为种子

点评

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

评分

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

查看全部评分

灯笼菜刀王 发表于 2018-3-31 22:54:19
ikki 发表于 2018-3-31 22:46
只有下载下来将我那个工程全部弄明白才会有很大的提升,还有就是作为从06年到现在的来说,看懂这个10年前的 ...

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

点评

RM的rand的取值问题比较坑,给你个思路,变量  发表于 2018-3-31 23:01
ikki 发表于 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 我很赞同

查看全部评分

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部