Відповіді:
Використовуйте 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