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

Project1

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

[讨论] Kernel模块和Random类里的rand有什么区别···

[复制链接]

Lv4.逐梦者

梦石
0
星屑
9280
在线时间
2504 小时
注册时间
2011-5-20
帖子
15389

开拓者

跳转到指定楼层
1
发表于 2018-1-30 19:20:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
module Kernel里面有一个rand方法
名为Random的类里也有一个rand方法
那为什么事件指令里的随机范围用的是Kernel里的rand呢···
[img]http://service.t.sina.com.cn/widget/qmd/5339802982/c02e16bd/7.png

Lv3.寻梦者

梦石
0
星屑
1248
在线时间
224 小时
注册时间
2017-12-12
帖子
204
2
发表于 2018-1-30 19:48:25 | 只看该作者
因为js调用是优先类内、父类然后跨页面调用按类引入顺序,一般来说为了易读顺序都是按首字母排列的,所以R就在后面了

点评

嗯,基本所有编程语言调用都是这个原则。然后外部引入类好像会比内部默认类优先级别再高点  发表于 2018-1-30 19:49
切记万物皆虚,你所看到的可能都只是虚假
----------------------------------------------------
只要离得远一点,再远一点,我就不会伤害到你了。
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
33103
在线时间
5104 小时
注册时间
2012-11-19
帖子
4878

开拓者

3
发表于 2018-1-30 19:53:03 | 只看该作者
num = Random.new
num.rand(100)

num = rand(100)

哪个更方便?

就像马桶边上明明有卫生纸,CHD菊苣非要用手指擦屁股一样。

点评

只用整数的情况是这样w不过需要随机一定范围内伤害百分比的情况感觉Random.new.rand(a..b)比(a+rand(b-a+1))/100要自然一些  发表于 2018-1-31 17:01
↓随机范围用核心的也可以啊,变成数组再 rand size ,比如:(50..100).map[rand 50]  发表于 2018-1-31 08:32
可是最小值不是0的时候Kernel的rand就没法rand(a..b)了···然而Random.new.rand(a..b)在va其实可以用···所以在奇怪事件指令的随机为什么放着自带更方便的不用  发表于 2018-1-31 00:47
xp vx va mv  va mz 各类型脚本/插件定制
回复 支持 反对

使用道具 举报

Lv4.逐梦者 (版主)

梦石
0
星屑
6901
在线时间
7028 小时
注册时间
2013-11-2
帖子
1344

开拓者剧作品鉴家

4
发表于 2018-1-30 20:30:28 | 只看该作者
本帖最后由 RaidenInfinity 于 2018-1-30 20:32 编辑

https://ruby-doc.org/core-2.2.0/Random.html

Random provides an interface to Ruby's pseudo-random number generator, or PRNG. The PRNG produces a deterministic sequence of bits which approximate true randomness. The sequence may be represented by integers, floats, or binary strings.

Random提供了Ruby伪随机数生成器(PRNG)的接口。PRNG会生成固定的,模拟真随机的一系列位(比特)。这些位可以以整数,浮点数或者二位元字符串来呈现。

The generator may be initialized with either a system-generated or user-supplied seed value by using ::srand.

生成器可以透过srand实例方法以系统随机生成的,或者用户指定的“种子”来初始化。

The class method #rand provides the base functionality of Kernel#rand along with better handling of floating point values. These are both interfaces to Random::DEFAULT, the Ruby system PRNG.

类方法rand提供了Kernel.rand的基本功能,而且更好地处理了浮点数。两者都是Random::DEFAULT(Ruby的默认PRNG)的接口。

::new will create a new PRNG with a state independent of Random::DEFAULT, allowing multiple generators with different seed values or sequence positions to exist simultaneously. Random objects can be marshaled, allowing sequences to be saved and resumed.

实例方法new会生成一个独立的PRNG。这允许复数个拥有不同状态(种子,序列位置)的PRNG同时存在。Random实例可以被Marshal序列化,因此可以保存起来(存档),也可以在读档后继续运行。




啥你不懂什么叫srand,不懂什么叫种子?我写的教程,章节1.7走起。

点评

还为什么XXX用的是YYY不用ZZZ。简直钻牛角尖钻到天元突破钻出了个新世纪。可笑。  发表于 2018-1-31 02:12
这TM就跟为啥明明有each还是有人要用for循环差不多。只懂for就用for呗。你懂each你冰淇淋炸天你用each呗。人家程序员只懂rand不懂Random他就用rand呗。  发表于 2018-1-31 02:09
还有钻TM牛角尖等所有人都觉得恶心了你烧香问神去。  发表于 2018-1-31 02:03
自己试下不就知道了呵  发表于 2018-1-31 02:02
那反过来,事件指令里的随机不用Kernel的rand会因为不能更好地处理浮点数导致什么bug吗?还是说多个随机放一起进行会爆炸···  发表于 2018-1-31 00:50

评分

参与人数 1+1 收起 理由
御曹司 + 1 666

查看全部评分

回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
4593
在线时间
1205 小时
注册时间
2016-4-7
帖子
982

开拓者

5
发表于 2018-1-30 21:05:29 | 只看该作者
本帖最后由 shitake 于 2018-1-30 21:09 编辑

C 代码复制
  1. rb_define_global_function("srand", rb_f_srand, -1);
  2.     rb_define_global_function("rand", rb_f_rand, -1);
  3.  
  4.     rb_cRandom = rb_define_class("Random", rb_cObject);
  5.     rb_define_alloc_func(rb_cRandom, random_alloc);
  6.     rb_define_method(rb_cRandom, "initialize", random_init, -1);
  7.     rb_define_method(rb_cRandom, "rand", random_rand, -1);

这是ruby 的random.c里最后定义Random这个类的时候的代码

其中
  1. rb_define_global_function("rand", rb_f_rand, -1);
复制代码
这句就是定义了Kernel的rand函数
而这个rb_f_rand 长这样:
C 代码复制
  1. static VALUE
  2. rb_f_rand(int argc, VALUE *argv, VALUE obj)
  3. {
  4.     VALUE vmax;
  5.     rb_random_t *rnd = rand_start(&default_rand);
  6.  
  7.     if (rb_check_arity(argc, 0, 1) && !NIL_P(vmax = argv[0])) {
  8.         VALUE v = rand_range(Qnil, rnd, vmax);
  9.         if (v != Qfalse) return v;
  10.         vmax = rb_to_int(vmax);
  11.         if (vmax != INT2FIX(0)) {
  12.             v = rand_int(Qnil, rnd, vmax, 0);
  13.             if (!NIL_P(v)) return v;
  14.         }
  15.     }
  16.     return DBL2NUM(genrand_real(&rnd->mt));
  17. }


  1. rb_define_method(rb_cRandom, "rand", random_rand, -1);
复制代码
这句就是在定义Random.rand了
random_rand长这样:
C 代码复制
  1. static VALUE
  2. random_rand(int argc, VALUE *argv, VALUE obj)
  3. {
  4.     VALUE v = rand_random(argc, argv, obj, get_rnd(obj));
  5.     check_random_number(v, argv);
  6.     return v;
  7. }
  8.  
  9. static VALUE
  10. rand_random(int argc, VALUE *argv, VALUE obj, rb_random_t *rnd)
  11. {
  12.     VALUE vmax, v;
  13.  
  14.     if (rb_check_arity(argc, 0, 1) == 0) {
  15.         return rb_float_new(random_real(obj, rnd, TRUE));
  16.     }
  17.     vmax = argv[0];
  18.     if (NIL_P(vmax)) return Qnil;
  19.     if (!RB_TYPE_P(vmax, T_FLOAT)) {
  20.         v = rb_check_to_int(vmax);
  21.         if (!NIL_P(v)) return rand_int(obj, rnd, v, 1);
  22.     }
  23.     v = rb_check_to_float(vmax);
  24.     if (!NIL_P(v)) {
  25.         const double max = float_value(v);
  26.         if (max < 0.0) {
  27.             return Qnil;
  28.         }
  29.         else {
  30.             double r = random_real(obj, rnd, TRUE);
  31.             if (max > 0.0) r *= max;
  32.             return rb_float_new(r);
  33.             }
  34.     }
  35.     return rand_range(obj, rnd, vmax);
  36. }


很明显可以看出 Kernel的起始值直接通过 default_rand 获得,而Random的则是调用 get_rnd。

点评

相当于亲爹和干儿子的关系吧?  发表于 2018-1-31 21:34

评分

参与人数 1+1 收起 理由
chd114 + 1 认可答案

查看全部评分

附庸的附庸不是我的附庸,女儿的女儿还是我的女儿。CK2沉迷ing
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-9-26 05:21

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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