Въпреки че никой компютър не може да генерира наистина произволни числа, Ruby осигурява достъп до метод, който ще се върне псевдослучайни номера.
Никой компютър не може да генерира истински случайни числа чисто чрез изчисляване. Най-доброто, което могат да направят, е да генерират псевдослучайни числа, които са поредица от числа, които се появи произволни, но не са.
За човешки наблюдател тези числа наистина са случайни. Няма да има кратки повтарящи се последователности и, поне на човешкия наблюдател, те няма да имат ясен модел. Въпреки това, предвид достатъчно време и мотивация, оригиналът семена може да бъде открита, последователността пресъздадена и следващото число в предположената последователност.
Поради тази причина методите, обсъждани в тази статия, вероятно не трябва да се използват за генериране на числа, които трябва да бъдат криптографски защитени.
Генераторите на псевдослучайни числа трябва да бъдат засява за да се получат последователности, които се различават всеки път, когато се генерира ново произволно число. Никой метод не е магически - тези на пръв поглед случайни числа се генерират с помощта на сравнително прости алгоритми и сравнително проста аритметика. Засявайки PRNG, вие го стартирате в различен момент всеки път. Ако не го посетите, той ще генерира една и съща последователност от числа всеки път.
В Ruby, the Ядрото # Srand метод може да бъде извикан без аргументи. Той ще избере семена с произволни числа въз основа на времето, идентификатора на процеса и поредния номер. Просто като се обадите Srand навсякъде в началото на вашата програма, тя ще генерира различна серия от привидно случайни числа всеки път, когато я стартирате. Този метод се извиква имплицитно при стартиране на програмата и засява PRNG с идентификатора на времето и процеса (без пореден номер).
След като програмата работи и Ядрото # Srand или имплицитно или изрично се нарича, Ядрото # ранд метод може да се нарече. Този метод, наречен без аргументи, ще върне произволно число от 0 до 1. В миналото този номер обикновено се мащабира до максималния брой, който искате да генерирате и може би to_i призовава го да го преобразува в цяло число.
Ruby обаче прави нещата малко по-лесни, ако използвате Ruby 1.9.x. Най- Ядрото # ранд метод може да вземе един аргумент. Ако този аргумент е a Цифрова от всякакъв вид, Ruby ще генерира цяло число от 0 до (и без да включва) това число.
Какво обаче, ако искате да генерирате число от 10 до 15? Обикновено можете да генерирате число от 0 до 5 и да го добавите към 10. Руби обаче го прави по-лесно.
Уверете се, че обръщате внимание на двата типа диапазони. Ако сте се обадили rand (10..15), което би генерирало число от 10 до 15 включително 15. докато rand (10... 15) (с 3 точки) ще генерира число от 10 до 15 без да включва 15.
Понякога се нуждаете от произволно изглеждаща последователност от числа, но трябва да генерирате една и съща последователност всеки път. Например, ако генерирате произволни числа в единичен тест, трябва да генерирате една и съща последователност от числа всеки път.
Тестът на единица, който се проваля в една последователност, трябва да се провали отново следващия път, когато се изпълни, ако следващия път генерира различна последователност, може да не се провали. За целта се обадете Ядрото # Srand с известна и постоянна стойност.
Въвеждането на Ядрото # ранд е по-скоро un-Ruby. Той не абстрахира PRNG по никакъв начин, нито ви позволява да създавате незабавно PRNG. Има една глобална държава за PRNG, която споделя всички кодове. Ако промените семето или по друг начин промените състоянието на PRNG, това може да има ефект от по-широк обхват, отколкото сте предполагали.
Тъй като обаче програмите очакват резултатът от този метод да е случаен - това е неговата цел! - това вероятно никога няма да е проблем. Само ако програмата очаква да види очакваната последователност от числа, например, ако се е обадила Srand с постоянна стойност, трябва ли да види неочаквани резултати.