Відповіді:
Використовуйте rand(range)
Якщо вам потрібно випадкове число , щоб імітувати рулон шестигранного штампа, ви будете використовувати:
1 + rand(6). Рулон у лайнах можна було б імітувати за допомогою2 + rand(6) + rand(6).Нарешті, якщо вам просто потрібен випадковий плавець, просто телефонуйте
randбез аргументів.
Як згадує Марк-Андре Лафортун у своїй відповіді нижче (перейдіть до нього) , у Рубі 1.9.2 є свій Randomклас (що сам Марк-Андре допоміг налагоджувати , отже, ціль 1.9.2 для цієї функції).
Наприклад, у цій грі, де вам потрібно відгадати 10 чисел , ви можете ініціалізувати їх за допомогою:
10.times.map{ 20 + Random.rand(11) }
#=> [26, 26, 22, 20, 30, 26, 23, 23, 25, 22]
Примітка:
Використання Random.new.rand(20..30)(використання Random.new) взагалі не було б гарною ідеєю, як детально (знову) пояснив Марк-Андре Лафортун у своїй відповіді (знову).
Але якщо ви не використовуєте Random.new, тоді метод класуrand приймає лише maxзначення, а не а Range, як баністер (енергійно) вказується в коментарі (і як це зафіксовано в документах дляRandom ). Тільки метод екземпляра може приймати a Range, як показано, генеруючи випадкове число з 7 цифр .
Ось чому еквівалент Random.new.rand(20..30)буде 20 + Random.rand(11), оскільки Random.rand(int)повертає "випадкове ціле число, що більше або дорівнює нулю і менше аргументу ". 20..30включає 30, мені потрібно придумати випадкове число між 0 і 11, виключаючи 11.
Randomклас, але це жахлива ідея викликати Random.newкілька разів, як у вашому прикладі. Я відредагував свою відповідь, щоб констатувати це.
Random.rand насправді приймає діапазон. (З 1.9.3, я вважаю.)
Хоча ви можете використовувати rand(42-10) + 10випадкове число між 10і 42(де 10 включно і 42 ексклюзивні), є кращий спосіб, оскільки Ruby 1.9.3, де ви можете зателефонувати:
rand(10...42) # => 13
Доступний для всіх версій Ruby, вимагаючи мого backportsдорогоцінного каменя.
Ruby 1.9.2 також представив Randomклас, щоб ви могли створити власні об'єкти генератора випадкових чисел та мати приємний API:
r = Random.new
r.rand(10...42) # => 22
r.bytes(3) # => "rnd"
Сам Randomклас виступає генератором випадкових випадків, тому ви телефонуєте безпосередньо:
Random.rand(10...42) # => same as rand(10...42)
Примітки до Random.new
У більшості випадків найпростішим є використання randабо Random.rand. Створення нового випадкового генератора кожного разу, коли вам потрібно випадкове число, - це дуже погана ідея . Якщо ви зробите це, ви отримаєте випадкові властивості алгоритму початкового висіву, які є суворими порівняно із властивостями самого генератора випадкових випадків .
Якщо ви користуєтесь Random.new, ви повинні називати це якомога рідше , наприклад, один раз MyApp::Random = Random.newі використовувати його скрізь в іншому місці.
Випадки, коли Random.newкорисні такі:
rand/ Random.rand, на яку можуть покладатися основні програмиRandomоб'єкти можуть бути змінені)backportsдорогоцінний камінь - це просто колекція методів, які є новими для RUby 1.8.7, 1.9.1, 1.9.2, але реалізовані в Ruby. Я використовую RubySpec, щоб гарантувати, що результати сумісні з Ruby.
Random.rand(10..42)не працює. Метод Random.randкласу не приймає діапазон. (Ruby 1.9.2p180)
Якщо ви шукаєте не тільки номер, а й шістнадцятковий або uuid, варто згадати, що SecureRandomмодуль знайшов шлях ActiveSupportдо ядра рубіна в 1.9.2+. Тож без необхідності повноцінного продукту:
require 'securerandom'
p SecureRandom.random_number(100) #=> 15
p SecureRandom.random_number(100) #=> 88
p SecureRandom.random_number #=> 0.596506046187744
p SecureRandom.random_number #=> 0.350621695741409
p SecureRandom.hex #=> "eb693ec8252cd630102fd0d0fb7c3485"
Це задокументовано тут: Ruby 1.9.3 - Модуль: SecureRandom (lib / securerandom.rb)
SecureRandom.random_number(1000..9999)
SecureRandom.random_number()не займає дальність, так що ні. Ви, мабуть, хочете чогось типу SecureRandom.random_number(10_000)(для 0-9999) або SecureRandom.random_number(9_000)+1_000(для 1000-9999).
За допомогою randметоду можна генерувати випадкове число . Аргумент, переданий randметоду, повинен бути a integerабо a rangeі повертає відповідне випадкове число в межах:
rand(9) # this generates a number between 0 to 8
rand(0 .. 9) # this generates a number between 0 to 9
rand(1 .. 50) # this generates a number between 1 to 50
#rand(m .. n) # m is the start of the number range, n is the end of number range
rand(1..6)читання чіткіше, ніж відповіді вгорі rand(6)+1.
Ну, я зрозумів це. Мабуть, є вбудована (?) Функція, яка називається rand:
rand(n + 1)
Якщо хтось відповість більш детальною відповіддю, я зазначу це як правильну відповідь.
Найпростіша відповідь на питання:
rand(0..n)
Ви можете просто використовувати random_number.
Якщо додатне ціле число задано як n, random_numberповертає ціле число: 0 <= random_number<n.
Використовуйте його так:
any_number = SecureRandom.random_number(100)
Вихід буде будь-яким числом від 0 до 100.
rand(6) #=> gives a random number between 0 and 6 inclusively
rand(1..6) #=> gives a random number between 1 and 6 inclusively
Зауважте, що опція діапазону доступна лише в новіших версіях (1,9+ я вважаю) рубінів.
ruby 1.9.3+. Не вийшло, 1.9.2коли я намагався принаймні.
ви можете робити rand (діапазон)
x = rand(1..5)
Це посилання стане корисним щодо цього;
http://ruby-doc.org/core-1.9.3/Random.html
І ще трохи ясності нижче випадкових чисел у рубіні;
Створіть ціле число від 0 до 10
puts (rand() * 10).to_i
Створіть число від 0 до 10 Більш читабельним способом
puts rand(10)
Утворіть число від 10 до 15, включаючи 15
puts rand(10..15)
Невипадкові випадкові числа
Створюйте однакову послідовність чисел щоразу, коли програма запускається
srand(5)
Утворіть 10 випадкових чисел
puts (0..10).map{rand(0..10)}
Можливо, це вам допоможе. Я використовую це у своєму додатку
https://github.com/rubyworks/facets
class String
# Create a random String of given length, using given character set
#
# Character set is an Array which can contain Ranges, Arrays, Characters
#
# Examples
#
# String.random
# => "D9DxFIaqR3dr8Ct1AfmFxHxqGsmA4Oz3"
#
# String.random(10)
# => "t8BIna341S"
#
# String.random(10, ['a'..'z'])
# => "nstpvixfri"
#
# String.random(10, ['0'..'9'] )
# => "0982541042"
#
# String.random(10, ['0'..'9','A'..'F'] )
# => "3EBF48AD3D"
#
# BASE64_CHAR_SET = ["A".."Z", "a".."z", "0".."9", '_', '-']
# String.random(10, BASE64_CHAR_SET)
# => "xM_1t3qcNn"
#
# SPECIAL_CHARS = ["!", "@", "#", "$", "%", "^", "&", "*", "(", ")", "-", "_", "=", "+", "|", "/", "?", ".", ",", ";", ":", "~", "`", "[", "]", "{", "}", "<", ">"]
# BASE91_CHAR_SET = ["A".."Z", "a".."z", "0".."9", SPECIAL_CHARS]
# String.random(10, BASE91_CHAR_SET)
# => "S(Z]z,J{v;"
#
# CREDIT: Tilo Sloboda
#
# SEE: https://gist.github.com/tilo/3ee8d94871d30416feba
#
# TODO: Move to random.rb in standard library?
def self.random(len=32, character_set = ["A".."Z", "a".."z", "0".."9"])
chars = character_set.map{|x| x.is_a?(Range) ? x.to_a : x }.flatten
Array.new(len){ chars.sample }.join
end
end
Це прекрасно працює для мене
Як щодо цього?
num = Random.new
num.rand(1..n)
Спробуйте array#shuffleметод рандомізації
array = (1..10).to_a
array.shuffle.first
.shuffle.firstна .sample!
srand <some_number>перед написаннямrandкоду дасть вам детерміновану (тобто повторювану) псевдовипадкову послідовність, якщо вам це потрібно. ruby-doc.org/core-2.5.6/Random.html#method-c-srand