Spec-Zone.ru › Ruby 2.4

класс Random

Родитель:
Объект
Включенные модули:
Random::Formatter

Random предоставляет интерфейс к псевдослучайному генератору чисел Руби или PRNG. PRNG генерирует детерминированную последовательность битов, которая приближает истинную случайность. Последовательность может быть представлена целыми числами, числами с плавающей точкой или двоичными строками.

Генератор может быть инициализирован значением семени, сгенерированным системой или предоставленным пользователем, используя ::srand.

Метод класса #rand предоставляет базовые функциональные возможности Kernel#rand вместе с лучшей обработкой чисел с плавающей точкой. Оба метода являются интерфейсами к Random::DEFAULT, псевдослучайному генератору системы Руби.

::new создаст новый PRNG со состоянием, независимым от Random::DEFAULT, что позволяет одновременно существовать нескольким генераторам с разными значениями семян или позициями в последовательности. Объекты Random могут быть сериализованы, что позволяет сохранять и возобновлять последовательности.

PRNG в настоящее время реализованы как модифицированный Mersenne Twister с периодом 2**19937-1.

Константы

DEFAULT

Публичные методы класса

new(seed = Random.new_seed) → prng Показать исходный код
static VALUE
random_init(int argc, VALUE *argv, VALUE obj)
{
    VALUE vseed;
    rb_random_t *rnd = get_rnd(obj);

    if (rb_check_arity(argc, 0, 1) == 0) {
        rb_check_frozen(obj);
        vseed = random_seed();
    }
    else {
        vseed = argv[0];
        rb_check_copyable(obj, vseed);
        vseed = rb_to_int(vseed);
    }
    rnd->seed = rand_init(&rnd->mt, vseed);
    return obj;
}

Создаёт новый PRNG, используя seed для установки начального состояния. Если seed опущен, генератор инициализируется с помощью ::new_seed.

См. ::srand для получения дополнительной информации об использовании значений семян.

new_seed → integer Показать исходный код
static VALUE
random_seed(void)
{
    VALUE v;
    uint32_t buf[DEFAULT_SEED_CNT+1];
    fill_random_seed(buf, DEFAULT_SEED_CNT);
    v = make_seed_value(buf, DEFAULT_SEED_CNT);
    explicit_bzero(buf, DEFAULT_SEED_LEN);
    return v;
}

Возвращает произвольное значение семени. Оно используется методом ::new, когда значение семени не указано в качестве аргумента.

Random.new_seed  #=> 115032730400174366788466674494640623225
rand → float Показать исходный код
rand(max) → number
static VALUE
random_s_rand(int argc, VALUE *argv, VALUE obj)
{
    VALUE v = rand_random(argc, argv, Qnil, rand_start(&default_rand));
    check_random_number(v, argv);
    return v;
}

Псевдоним Random::DEFAULT.rand.

raw_seed(size) → string Показать исходный код
static VALUE
random_raw_seed(VALUE self, VALUE size)
{
    long n = NUM2ULONG(size);
    VALUE buf = rb_str_new(0, n);
    if (n == 0) return buf;
    if (fill_random_bytes(RSTRING_PTR(buf), n, FALSE)) return Qnil;
    return buf;
}

Возвращает исходную строку семени, используя платформенные возможности.

Random.raw_seed(8)  #=> "\x78\x41\xBA\xAF\x7D\xEA\xD8\xEA"
srand(number = Random.new_seed) → old_seed Показать исходный код
static VALUE
rb_f_srand(int argc, VALUE *argv, VALUE obj)
{
    VALUE seed, old;
    rb_random_t *r = &default_rand;

    if (rb_check_arity(argc, 0, 1) == 0) {
        seed = random_seed();
    }
    else {
        seed = rb_to_int(argv[0]);
    }
    old = r->seed;
    r->seed = rand_init(&r->mt, seed);

    return old;
}

Инициализирует генератор псевдослучайных чисел системы, Random::DEFAULT, значением number. Возвращает предыдущее значение семени.

Если number опущен, инициализирует генератор, используя источник энтропии, предоставляемый операционной системой (если доступен, /dev/urandom в системах Unix или криптографический провайдер RSA в Windows), который затем комбинируется с временем, идентификатором процесса и порядковым номером.

srand может использоваться для обеспечения воспроизводимых последовательностей псевдослучайных чисел в разных запусках программы. Установкой семени в известное значение можно сделать программы детерминированными во время тестирования.

srand 1234               # => 268519324636777531569100071560086917274
[ rand, rand ]           # => [0.1915194503788923, 0.6221087710398319]
[ rand(10), rand(1000) ] # => [4, 664]
srand 1234               # => 1234
[ rand, rand ]           # => [0.1915194503788923, 0.6221087710398319]

Публичные методы экземпляра

prng1 == prng2 → true or false Показать исходный код
static VALUE
random_equal(VALUE self, VALUE other)
{
    rb_random_t *r1, *r2;
    if (rb_obj_class(self) != rb_obj_class(other)) return Qfalse;
    r1 = get_rnd(self);
    r2 = get_rnd(other);
    if (memcmp(r1->mt.state, r2->mt.state, sizeof(r1->mt.state))) return Qfalse;
    if ((r1->mt.next - r1->mt.state) != (r2->mt.next - r2->mt.state)) return Qfalse;
    if (r1->mt.left != r2->mt.left) return Qfalse;
    return rb_equal(r1->seed, r2->seed);
}

Возвращает true, если два генератора имеют одинаковое внутреннее состояние, иначе false. Эквивалентные генераторы вернут ту же последовательность псевдослучайных чисел. Два генератора обычно будут иметь одинаковое состояние только в том случае, если они были инициализированы одним и тем же семенем

Random.new == Random.new             # => false
Random.new(1234) == Random.new(1234) # => true

и имели одинаковую историю вызовов.

prng1 = Random.new(1234)
prng2 = Random.new(1234)
prng1 == prng2 # => true

prng1.rand     # => 0.1915194503788923
prng1 == prng2 # => false

prng2.rand     # => 0.1915194503788923
prng1 == prng2 # => true
bytes(size) → a_string Показать исходный код
static VALUE
random_bytes(VALUE obj, VALUE len)
{
    return genrand_bytes(get_rnd(obj), NUM2LONG(rb_to_int(len)));
}

Возвращает случайную двоичную строку, содержащую size байтов.

random_string = Random.new.bytes(10) # => "\xD7:R\xAB?\x83\xCE\xFAkO"
random_string.size                   # => 10
rand → float Показать исходный код
rand(max) → number
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;
}

Когда max является целым числом, rand возвращает случайное целое число, большее или равное нулю и меньшее чем max. В отличие от Kernel#rand, когда max является отрицательным целым числом или нулём, rand вызывает ArgumentError.

prng = Random.new
prng.rand(100)       # => 42

Когда max является числом с плавающей точкой, rand возвращает случайное число с плавающей точкой между 0,0 и max, включая 0,0 и исключая max.

prng.rand(1.5)       # => 1.4600282860034115

Когда max является диапазоном, rand возвращает случайное число, где range.member?(number) == true.

prng.rand(5..9)      # => one of [5, 6, 7, 8, 9]
prng.rand(5...9)     # => one of [5, 6, 7, 8]
prng.rand(5.0..9.0)  # => between 5.0 and 9.0, including 9.0
prng.rand(5.0...9.0) # => between 5.0 and 9.0, excluding 9.0

Оба крайних значения диапазона должны иметь методы вычитания (-) и сложения (+), или rand вызовет ArgumentError.

seed → integer Показать исходный код
static VALUE
random_get_seed(VALUE obj)
{
    return get_rnd(obj)->seed;
}

Возвращает значение семени, используемое для инициализации генератора. Оно может быть использовано для инициализации другого генератора с тем же состоянием в более позднее время, что заставит его генерировать ту же последовательность чисел.

prng1 = Random.new(1234)
prng1.seed       #=> 1234
prng1.rand(100)  #=> 47

prng2 = Random.new(prng1.seed)
prng2.rand(100)  #=> 47

Ruby Core © 1993–2017 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API