Project1

标题: Kernel模块和Random类里的rand有什么区别··· [打印本页]

作者: chd114    时间: 2018-1-30 19:20
标题: Kernel模块和Random类里的rand有什么区别···
module Kernel里面有一个rand方法
名为Random的类里也有一个rand方法
那为什么事件指令里的随机范围用的是Kernel里的rand呢···
作者: 陆言儿    时间: 2018-1-30 19:48
因为js调用是优先类内、父类然后跨页面调用按类引入顺序,一般来说为了易读顺序都是按首字母排列的,所以R就在后面了
作者: 芯☆淡茹水    时间: 2018-1-30 19:53
num = Random.new
num.rand(100)

num = rand(100)

哪个更方便?

就像马桶边上明明有卫生纸,CHD菊苣非要用手指擦屁股一样。
作者: RaidenInfinity    时间: 2018-1-30 20:30
本帖最后由 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走起。
作者: shitake    时间: 2018-1-30 21:05
本帖最后由 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。




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