Вернуть true с вероятностью веса в Ruby [duplicate]

  1. Java не поддерживает множественное наследование, а это значит, что вы можете расширять только один класс на Java, поэтому, как только вы расширили Thread класс, вы потеряли свой шанс и не можете расширять или наследовать другой класс на Java.
  2. В объектно-ориентированном программировании расширение класса обычно означает добавление новых функций, изменение или улучшение поведения. Если мы не делаем каких-либо изменений на Thread, чем используем интерфейс Runnable. Интерфейс
  3. Runnable представляет собой Task, который может быть выполнен либо обычным Thread, либо Executors или любые другие средства. Таким образом, логическое разделение Task как Runnable, чем Thread, является хорошим конструктивным решением.
  4. Отделяющая задача как Runnable означает, что мы можем повторно использовать задачу, а также иметь возможность выполнять ее с разных средств. Поскольку вы не можете перезапустить Thread после его завершения, снова Runnable vs Thread для задачи, Runnable является победителем.
  5. Разработчик Java распознает это, и именно поэтому Executors принимает Runnable ] как Task, и у них есть рабочий поток, который выполняет эту задачу.
  6. Наследование всех методов Thread - дополнительные накладные расходы только для представления функции Task, которая может быть легко выполнена с помощью Runnable.
705
задан the Tin Man 22 August 2016 в 17:45
поделиться

17 ответов

Используйте rand(range)

Из Случайные числа Ruby :

Если вам понадобилось случайное целое число имитируйте рулон шестисторонней матрицы, вы будете использовать: 1 + rand(6).

Наконец, если вам просто нужен случайный поплавок, просто вызовите 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) будет 20 + Random.rand(11), так как Random.rand(int) возвращает «случайное целое число, большее или равное нулю, а меньше аргумента 20..30 включает 30, мне нужно придумайте случайное число от 0 до 11, исключая 11.

881
ответ дан thumbtackthief 19 August 2018 в 11:56
поделиться
  • 1
    Разве это не ужасно нерубино? Я думал, что все является объектом, наименее неожиданным и тем ... – Dan Rosenstark 26 January 2010 в 19:50
  • 2
    @yar: Это немного "perlish". Теперь Ruby имеет класс Random (см. Мой ответ) – Marc-André Lafortune 5 May 2010 в 15:02
  • 3
    @VonC: Замечательно, что вы отредактировали свой ответ, чтобы упомянуть новый класс Random, но это страшная идея называть Random.new несколько раз, как в вашем примере. Я отредактировал свой ответ, чтобы заявить об этом. – Marc-André Lafortune 17 June 2011 в 18:11
  • 4
    @VonC ах :) Извините, если я был немного суровым, он просто удивил меня – horseyguy 27 June 2011 в 12:10
  • 5
    Random.rand действительно принимает диапазон. (Я считаю, что с 1.9.3). – Ajedi32 2 January 2015 в 20:56

Возможно, это поможет вам. Я использую это в своем приложении

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

https://github.com/rubyworks/facets/blob/5569b03b4c6fd25897444a266ffe25872284be2b/lib/core/facets/string/random.rb

Он отлично работает для меня

2
ответ дан amarradi 19 August 2018 в 11:56
поделиться

Если вы ищете не только число, но и 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)

43
ответ дан bv. 19 August 2018 в 11:56
поделиться
  • 1
    А если вам понадобится 4 цифры случайного числа? – onurozgurozkan 2 February 2014 в 00:12
  • 2
    onurozgurozkan Я предполагаю SecureRandom.random_number(1000..9999) – JayTarka 9 August 2015 в 02:59
  • 3
    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
  • 4
    Random.rand (1000..9999) – Jesse Farmer 25 June 2016 в 21:57

Самый простой ответ на вопрос:

rand(0..n)
11
ответ дан dgilperez 19 August 2018 в 11:56
поделиться
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+].

6
ответ дан Josh 19 August 2018 в 11:56
поделиться
  • 1
    Я считаю, что опция диапазона доступна только в ruby 1.9.3+. Он не работал в 1.9.2, когда я пытался хотя бы. – Batkins 13 December 2012 в 23:24

Как насчет этого?

num = Random.new
num.rand(1..n)
2
ответ дан Juan Dela Cruz 19 August 2018 в 11:56
поделиться

Попробуйте метод array#shuffle для рандомизации

array = (1..10).to_a
array.shuffle.first
2
ответ дан lennon310 19 August 2018 в 11:56
поделиться

Не забудьте сначала засеять RNG с помощью srand () .

0
ответ дан Liebach 19 August 2018 в 11:56
поделиться
  • 1
    Что произойдет, если вы не вызываете srand ()? – Alex B 17 October 2008 в 15:18
  • 2
    srand автоматически вызывается с семенем из текущего времени, если он еще не был вызван. – Julian H 6 February 2010 в 10:25

Хотя вы можете использовать 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 могут сортироваться)
571
ответ дан Marc-André Lafortune 19 August 2018 в 11:56
поделиться
  • 1
    Отлично! +1. Я выполнил свой собственный ответ, чтобы отразить эту новую функцию (и упомянул ваш вклад с Bug # 3104;)). – VonC 5 May 2010 в 15:20
  • 2
    Как работает жемчуг backports, с широкими штрихами? – Dan Rosenstark 5 May 2010 в 16:08
  • 3
    @yar: Мой жемчуг backports - это просто набор методов, которые являются новыми для RUby 1.8.7, 1.9.1, 1.9.2, но реализованы в Ruby. Я использую RubySpec для обеспечения совместимости результатов с Ruby. – Marc-André Lafortune 5 May 2010 в 16:16
  • 4
    Random.rand(10..42) не работает. Метод класса Random.rand не принимает диапазон. (Ruby 1.9.2p180) – horseyguy 27 June 2011 в 08:46
  • 5
    @banister: ничего себе, я был убежден, что новый api (rand с диапазоном, байтами и т. д.) был доступен непосредственно через объект Random. rand с диапазоном будет в 1.9.3, и я сделаю запрос функции для байтов. Я отредактировал свой ответ – Marc-André Lafortune 27 June 2011 в 15:20

Ну, я понял это. По-видимому, существует встроенная функция (?), Называемая rand:

rand(n + 1)

Если кто-то отвечает более подробным ответом, я буду отмечать это как правильный ответ.

20
ответ дан Mark A. Nicolosi 19 August 2018 в 11:56
поделиться

Вы можете создать случайное число с помощью метода 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
33
ответ дан MattD 19 August 2018 в 11:56
поделиться
  • 1
    Это может быть и Float. rand(1.1..2.7) работает. – pisaruk 2 December 2013 в 14:25
  • 2
    Я думаю, что использование вашего rand(1..6) читается более четким, чем верхний ответ rand(6)+1. – isomorphismes 12 June 2014 в 10:05
  • 3
    почему Ранд не является методом Range. – Arnold Roa 21 September 2017 в 03:05

Как насчет этого?

n = 3
(0..n).to_a.sample
18
ответ дан Rimian 19 August 2018 в 11:56
поделиться
  • 1
    Следует отметить, что генерация массива чисел, подобных этому решению, имеет ужасную производительность на больших диапазонах, так как O (n), а 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)}
4
ответ дан Sam 19 August 2018 в 11:56
поделиться

вы можете сделать rand (диапазон)

x = rand(1..5)
3
ответ дан Snifferdog 19 August 2018 в 11:56
поделиться

range = 10..50

rand (диапазон)

или

range.to_a.sample

или

g4]

range.to_a.shuffle (это будет перемешать весь массив, и вы можете выбрать случайное число первым или последним или любым из этого массива, чтобы выбрать случайный)

3
ответ дан sumit 19 August 2018 в 11:56
поделиться

Вы можете просто использовать random_number.

Если положительное целое число задано как n, random_number возвращает целое число: 0 & lt; = random_number & lt; n.

Используйте его следующим образом:

any_number = SecureRandom.random_number(100) 

На выходе будет любое число от 0 до 100.

5
ответ дан techdreams 19 August 2018 в 11:56
поделиться

Легкий способ получить случайное число в рубине,

def random    
  (1..10).to_a.sample.to_s
end
1
ответ дан ysk 19 August 2018 в 11:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: