array - ruby sample random




如何在Ruby中獲得一個隨機數字 (12)

不要忘記首先用srand()播種RNG。

如何生成0n之間的隨機數字?


也許它會幫助你。 我在我的應用程序中使用這個

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

這對我來說可以


你可以簡單地使用random_number

如果以n給出正整數,則random_number返回整數:0 <= random_number <n。

像這樣使用它:

any_number = SecureRandom.random_number(100) 

輸出將是0到100之間的任何數字。


使用rand(range)

Ruby隨機數字

如果你需要一個隨機整數來模擬一個六面骰子的捲,你可以使用: 1 + rand(6) 。 擲骰子可以用2 + rand(6) + rand(6)來模擬。

最後,如果你只需要一個隨機的浮點數,只需要調用rand而不需要參數。

正如Marc-AndréLafortune在他的回答中提到的(注意它)Ruby 1.9.2有它自己的Random (Marc-André自己幫助調試 ,因此該特性的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 )通常不是一個好主意,正如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。


在ruby中獲得隨機數的簡單方法是,

def random    
  (1..10).to_a.sample.to_s
end

如果您不只是在尋找一個數字,而且還需要十六進製或uuid,值得一提的是SecureRandom模塊在ActiveSupport找到了從ActiveSupport到ruby核心的路徑。 所以不需要一個完整的框架:

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)


您可以使用rand方法生成一個隨機數。 傳遞給rand方法的參數應該是integerrange ,並返回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

範圍= 10..50

蘭特(範圍)

要么

range.to_a.sample

要么

range.to_a.shuffle (這將洗牌整個數組,並且可以通過第一個或最後一個或任何來自該數組的隨機數挑選隨機數)


這個鏈接將對此有所幫助;

http://ruby-doc.org/core-1.9.3/Random.html

下面還有一些關於ruby中隨機數的更加清晰的例子。

生成一個從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)}

那這個呢?

n = 3
(0..n).to_a.sample

雖然你可以使用rand(42-10) + 10來獲得一個1042之間的隨機數(其中10是包含的,42是獨占的),但是從Ruby 1.9.3開始你可以調用更好的方法:

rand(10...42) # => 13

適用於所有版本的Ruby,需要使用我的backports gem。

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註釋

在大多數情況下,最簡單的是使用randRandom.rand 。 每次你想要一個隨機數時創建一個新的隨機生成器是一個非常糟糕的主意 。 如果你這樣做,你會得到初始種子算法的隨機特性,這與隨機發生器本身的特性相比是非常殘酷的。

如果使用Random.new ,則應該盡可能少地調用它,例如一次使用MyApp::Random = Random.new並在其他地方使用它。

Random.new有幫助的情況如下:

  • 你正在寫一個寶石,不想干擾rand / Random.rand的順序,主程序可能依賴於
  • 你需要單獨的可重複序列的隨機數字(比如每個線程一個)
  • 你希望能夠保存和恢復一個可重現的隨機數序列(就像Random對象可以編組一樣簡單)

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 +我相信)版本的紅寶石。





random