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 编辑
rb_define_global_function( "srand" , rb_f_srand, -1 ) ;
rb_define_global_function( "rand" , rb_f_rand, -1 ) ;
rb_cRandom = rb_define_class( "Random" , rb_cObject) ;
rb_define_alloc_func( rb_cRandom, random_alloc) ;
rb_define_method( rb_cRandom, "initialize" , random_init, -1 ) ;
rb_define_method( rb_cRandom, "rand" , random_rand, -1 ) ;
rb_define_global_function( "srand" , rb_f_srand, -1 ) ;
rb_define_global_function( "rand" , rb_f_rand, -1 ) ;
rb_cRandom = rb_define_class( "Random" , rb_cObject) ;
rb_define_alloc_func( rb_cRandom, random_alloc) ;
rb_define_method( rb_cRandom, "initialize" , random_init, -1 ) ;
rb_define_method( rb_cRandom, "rand" , random_rand, -1 ) ;
这是ruby 的random.c里最后定义Random这个类的时候的代码
其中rb_define_global_function("rand", rb_f_rand, -1); 复制代码 这句就是定义了Kernel的rand函数
而这个rb_f_rand 长这样:
static VALUE
rb_f_rand( int argc, VALUE *argv, VALUE obj)
{
VALUE vmax;
rb_random_t *rnd = rand_start( &default_rand) ;
if ( rb_check_arity( argc, 0 , 1 ) && !NIL_P( vmax = argv[ 0 ] ) ) {
VALUE v = rand_range( Qnil, rnd, vmax) ;
if ( v != Qfalse) return v;
vmax = rb_to_int( vmax) ;
if ( vmax != INT2FIX( 0 ) ) {
v = rand_int( Qnil, rnd, vmax, 0 ) ;
if ( !NIL_P( v) ) return v;
}
}
return DBL2NUM( genrand_real( &rnd->mt) ) ;
}
static VALUE
rb_f_rand( int argc, VALUE *argv, VALUE obj)
{
VALUE vmax;
rb_random_t *rnd = rand_start( &default_rand) ;
if ( rb_check_arity( argc, 0 , 1 ) && !NIL_P( vmax = argv[ 0 ] ) ) {
VALUE v = rand_range( Qnil, rnd, vmax) ;
if ( v != Qfalse) return v;
vmax = rb_to_int( vmax) ;
if ( vmax != INT2FIX( 0 ) ) {
v = rand_int( Qnil, rnd, vmax, 0 ) ;
if ( !NIL_P( v) ) return v;
}
}
return DBL2NUM( genrand_real( &rnd->mt) ) ;
}
而rb_define_method(rb_cRandom, "rand", random_rand, -1); 复制代码 这句就是在定义Random.rand了
random_rand长这样:
static VALUE
random_rand( int argc, VALUE *argv, VALUE obj)
{
VALUE v = rand_random( argc, argv, obj, get_rnd( obj) ) ;
check_random_number( v, argv) ;
return v;
}
static VALUE
rand_random( int argc, VALUE *argv, VALUE obj, rb_random_t *rnd)
{
VALUE vmax, v;
if ( rb_check_arity( argc, 0 , 1 ) == 0 ) {
return rb_float_new( random_real( obj, rnd, TRUE ) ) ;
}
vmax = argv[ 0 ] ;
if ( NIL_P( vmax) ) return Qnil;
if ( !RB_TYPE_P( vmax, T_FLOAT) ) {
v = rb_check_to_int( vmax) ;
if ( !NIL_P( v) ) return rand_int( obj, rnd, v, 1 ) ;
}
v = rb_check_to_float( vmax) ;
if ( !NIL_P( v) ) {
const double max = float_value( v) ;
if ( max < 0.0 ) {
return Qnil;
}
else {
double r = random_real( obj, rnd, TRUE ) ;
if ( max > 0.0 ) r *= max;
return rb_float_new( r) ;
}
}
return rand_range( obj, rnd, vmax) ;
}
static VALUE
random_rand( int argc, VALUE *argv, VALUE obj)
{
VALUE v = rand_random( argc, argv, obj, get_rnd( obj) ) ;
check_random_number( v, argv) ;
return v;
}
static VALUE
rand_random( int argc, VALUE *argv, VALUE obj, rb_random_t *rnd)
{
VALUE vmax, v;
if ( rb_check_arity( argc, 0 , 1 ) == 0 ) {
return rb_float_new( random_real( obj, rnd, TRUE ) ) ;
}
vmax = argv[ 0 ] ;
if ( NIL_P( vmax) ) return Qnil;
if ( !RB_TYPE_P( vmax, T_FLOAT) ) {
v = rb_check_to_int( vmax) ;
if ( !NIL_P( v) ) return rand_int( obj, rnd, v, 1 ) ;
}
v = rb_check_to_float( vmax) ;
if ( !NIL_P( v) ) {
const double max = float_value( v) ;
if ( max < 0.0 ) {
return Qnil;
}
else {
double r = random_real( obj, rnd, TRUE ) ;
if ( max > 0.0 ) r *= max;
return rb_float_new( r) ;
}
}
return rand_range( obj, rnd, vmax) ;
}
很明显可以看出 Kernel的起始值直接通过 default_rand 获得,而Random的则是调用 get_rnd。
欢迎光临 Project1 (https://rpg.blue/)
Powered by Discuz! X3.1