Thread
класс, вы потеряли свой шанс и не можете расширять или наследовать другой класс на Java. Thread
, чем используем интерфейс Runnable
. Интерфейс Runnable
представляет собой Task
, который может быть выполнен либо обычным Thread
, либо Executors
или любые другие средства. Таким образом, логическое разделение Task
как Runnable
, чем Thread
, является хорошим конструктивным решением. Runnable
означает, что мы можем повторно использовать задачу, а также иметь возможность выполнять ее с разных средств. Поскольку вы не можете перезапустить Thread
после его завершения, снова Runnable
vs Thread
для задачи, Runnable
является победителем. Executors
принимает Runnable
] как Task
, и у них есть рабочий поток, который выполняет эту задачу. Thread
- дополнительные накладные расходы только для представления функции Task
, которая может быть легко выполнена с помощью Runnable
. Используйте rand(range)
Из Случайные числа Ruby :
Если вам понадобилось случайное целое число имитируйте рулон шестисторонней матрицы, вы будете использовать:
1 + rand(6)
.Наконец, если вам просто нужен случайный поплавок, просто вызовите
blockquote>rand
без аргументов.
Как Марк-Андре Лафортун упоминает в свой ответ ниже (идите вверх) , Ruby 1.9.2 имеет свой
Random
класс (что сам Марк-Андре помог отладить , следовательно, 1.9.2 target для этой функции).Например, в этом Если вам нужно угадать 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
), как правило, не было бы хорошей идеей, как подробно объяснялось Marc-André Lafortune , в его ответе (снова).- Но если вы не используете
Random.new
, то метод классаrand
принимает значениеmax
, а неRange
, как перила (энергетически ) указывает в комментарии (и как описано в документах дляRandom
). Только метод экземпляра может приниматьRange
, как показано в , генерировать случайное число с 7 цифрами .Вот почему эквивалент
Random.new.rand(20..30)
будет20 + Random.rand(11)
, так какRandom.rand(int)
возвращает «случайное целое число, большее или равное нулю, а меньше аргумента .»20..30
включает 30, мне нужно придумайте случайное число от 0 до 11, исключая 11.
Возможно, это поможет вам. Я использую это в своем приложении
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
Он отлично работает для меня
Если вы ищете не только число, но и hex или uuid, стоит упомянуть, что модуль SecureRandom
нашел путь от ActiveSupport
до ядра ruby в 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 - Module: SecureRandom (lib / securerandom.rb)
SecureRandom.random_number(1000..9999)
– JayTarka
9 August 2015 в 02:59
SecureRandom.random_number()
не принимает диапазон, поэтому нет. Вероятно, вам понадобится нечто вроде SecureRandom.random_number(10_000)
(для 0-9999) или SecureRandom.random_number(9_000)+1_000
(для 1000-9999).
– mwp
27 October 2015 в 18:38
rand(6) #=> gives a random number between 0 and 6 inclusively
rand(1..6) #=> gives a random number between 1 and 6 inclusively
Обратите внимание, что опция диапазона доступна только в новых версиях ruby [1.9+].
ruby 1.9.3+
. Он не работал в 1.9.2
, когда я пытался хотя бы.
– Batkins
13 December 2012 в 23:24
Как насчет этого?
num = Random.new
num.rand(1..n)
Попробуйте метод array#shuffle
для рандомизации
array = (1..10).to_a
array.shuffle.first
Не забудьте сначала засеять RNG с помощью srand () .
Хотя вы можете использовать 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.
– Marc-André Lafortune
5 May 2010 в 16:16
Random.rand(10..42)
не работает. Метод класса Random.rand
не принимает диапазон. (Ruby 1.9.2p180)
– horseyguy
27 June 2011 в 08:46
Ну, я понял это. По-видимому, существует встроенная функция (?), Называемая rand:
rand(n + 1)
Если кто-то отвечает более подробным ответом, я буду отмечать это как правильный ответ.
Вы можете создать случайное число с помощью метода rand
. Аргумент, переданный методу rand
, должен быть integer
или 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
.
– isomorphismes
12 June 2014 в 10:05
rand
- O (1).
– Travis
23 February 2017 в 15:01
Эта ссылка будет полезна для этого:
http://ruby-doc.org/core-1.9.3/Random.html
И еще немного ясности ниже случайных чисел в ruby;
Генерировать целое число от 0 до 10
puts (rand() * 10).to_i
Создать число от 0 до 10 В более читаемом way
puts rand(10)
Создать число от 10 до 15 Включая 15
puts rand(10..15)
Неслучайные случайные числа
Произвольно порождать одну и ту же последовательность чисел программа запускается
srand(5)
Сгенерируйте 10 случайных чисел
puts (0..10).map{rand(0..10)}
вы можете сделать rand (диапазон)
x = rand(1..5)
range = 10..50
rand (диапазон)
или
range.to_a.sample
или
g4]range.to_a.shuffle (это будет перемешать весь массив, и вы можете выбрать случайное число первым или последним или любым из этого массива, чтобы выбрать случайный)
Вы можете просто использовать random_number
.
Если положительное целое число задано как n, random_number
возвращает целое число: 0 & lt; = random_number
& lt; n.
Используйте его следующим образом:
any_number = SecureRandom.random_number(100)
На выходе будет любое число от 0 до 100.
Легкий способ получить случайное число в рубине,
def random
(1..10).to_a.sample.to_s
end
Random
, но это страшная идея называтьRandom.new
несколько раз, как в вашем примере. Я отредактировал свой ответ, чтобы заявить об этом. – Marc-André Lafortune 17 June 2011 в 18:11Random.rand
действительно i> принимает диапазон. (Я считаю, что с 1.9.3). – Ajedi32 2 January 2015 в 20:56