Како генерирати случајне бројеве у Рубину

Иако ниједан рачунар не може генерисати заиста случајне бројеве, Руби пружа приступ методи која ће се вратити псеудорандом бројеви.

Ниједан рачунар не може заиста да генерише насумични бројеви чисто рачунањем. Најбоље што могу је да генеришу псеудорандом бројеви, који су низ бројева који појавити насумично, али нису.

За људског посматрача, ови бројеви су заиста случајни. Неће бити кратких понављајућих секвенци и, бар људском посматрачу, они неће представити јасан образац. Међутим, с обзиром на довољно времена и мотивације, оригинал семе може се открити, редослед поново креиран и наредни број у претпостављеном низу.

Из овог разлога, методе о којима је реч у овом чланку вероватно не би требало да се користе за генерисање бројева који морају бити криптографски сигурни.

Генератори псеудо случајних бројева морају бити сејано како би се произвели низови који се разликују сваки пут када се генерише нови случајни број. Ниједна метода није магична - ови наизглед случајни бројеви се генеришу коришћењем релативно једноставних алгоритама и релативно једноставне аритметике. Сјетвом ПРНГ-а покрећете га сваки пут у другој точки. Ако га не посејете, сваки пут би генерисао исти низ бројева.

instagram viewer

У Руби, тхе Кернел # сранд метода се може назвати без аргумената. Биће семе случајног броја на основу времена, ИД процеса и редног броја. Једноставно позивом сранд било где на почетку вашег програма, он ће генерирати различите серије наизглед насумичних бројева сваки пут када га покренете. Ова метода се зове имплицитно када се програм покрене и засија ПРНГ са временом и ИД-ом процеса (без редног броја).

Једном када се програм покрене и Кернел # сранд било имплицитно или експлицитно позвано, Кернел # ранд може се назвати метода. Ова метода, позвана без аргумената, враћаће случајни број од 0 до 1. У прошлости се тај број обично скалирао до максималног броја који бисте желели да генеришете, а можда и то_и позвао га је да га претвори у цијели број.

Међутим, Руби нешто олакшава ако користите Руби 1.9.к. Тхе Кернел # ранд метода може узети један аргумент. Ако је овај аргумент а Нумерички било које врсте, Руби ће генерисати цео број од 0 до (а не укључујући) тај број.

Међутим, шта ако желите да генеришете број од 10 до 15? Обично бисте генерирали број од 0 до 5 и додали га 10. Међутим, Руби то олакшава.

Обавезно обратите пажњу на две врсте опсега. Ако сте звали ранд (10..15), то би створило број од 10 до 15 укључујући 15. Док ранд (10... 15) (са 3 тачке) створио би број од 10 до 15 не укључујући 15.

Понекад вам је потребан низ насумичних изгледа бројева, али сваки пут морате генерирати исти низ. На пример, ако генеришете случајне бројеве у јединици теста, сваки пут бисте требали да генеришете исти редослед бројева.

Јединствени тест који не успије на једном слиједу, требао би поново пропасти сљедећи пут када се покрене, ако је сљедећи пут генерирао различиту секвенцу, можда неће успјети. Да бисте то урадили, позовите Кернел # сранд са познатом и константном вредношћу.

Имплементација Кернел # ранд је прилично не-Руби. Не апсорбује ПРНГ ни на који начин, нити вам омогућава да инстанцирате ПРНГ. Постоји једна глобална држава за ПРНГ коју дели сви кодекси. Ако промените семе или на неки други начин промените стање ПРНГ, он може имати шири спектар ефекта него што сте предвиђали.

Међутим, пошто програми очекују да резултат ове методе буде насумичан - то је његова сврха! - то вероватно никада неће бити проблем. Само ако програм очекује да очекује очекивани низ бројева, као што је ако је позвао сранд са константном вредношћу, треба ли да види неочекиване резултате.