簡體   English   中英

如何獲得Ruby中的隨機數

[英]How to get a random number in Ruby

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

使用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)的等價物將是20 + Random.rand(11) ,因為Random.rand(int)返回“一個大於或等於零且小於爭論。” 20..30包括 30,我需要在 0 到 11 之間20..30一個隨機數,不包括 11。

雖然你可以使用rand(42-10) + 10獲得之間的隨機數1042 (其中10是包容性和排他性42),有自紅寶石1.9.3,您可以撥打其中一個更好的方法:

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

通過需要我的backports gem 可用於所有版本的 Ruby。

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有用的情況如下:

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

如果您不僅要尋找數字,還要尋找十六進制或 uuid,那么值得一提的是SecureRandom模塊在 1.9.2+ 中從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

嗯,我想通了。 顯然有一個名為 rand 的內置 (?) 函數:

rand(n + 1)

如果有人給出更詳細的答案,我會將其標記為正確答案。

那這個呢?

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

最簡單的問題答案:

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​​ 中可用。

范圍 = 10..50

蘭特(范圍)

或者

range.to_a.sample

或者

range.to_a.shuffle (這將打亂整個數組,您可以通過第一個或最后一個隨機數或從該數組中選擇一個隨機數來選擇隨機數)

你可以做 rand(range)

x = rand(1..5)

此鏈接將對此有所幫助;

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)}

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

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

也許它對你有幫助。 我在我的應用程序中使用它

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

這對我來說可以

這個怎么樣?

num = Random.new
num.rand(1..n)

嘗試使用array#shuffle方法進行隨機化

array = (1..10).to_a
array.shuffle.first

在ruby語言中,我們有方法作為rand() 您可以使用此方法生成隨機數。 rand()方法只有整數參數或范圍。此方法的返回類型是隨機整數。

 rand()          # This Will generates a random number between 0.0 to 1.0
 rand(10)        # This Will generates a number between 0 to 10
 rand(1 .. 9)    # This Will generates a number between 1 to 10
 rand(1 ... 10)  # This Will generates a number between 2 to 9

注意: rand()生成的數字足以用於簡單的應用程序。

但是如果出於安全目的需要它,比如生成一次性密碼,創建密碼重置令牌,那么你必須使用Ruby標准庫中的一個SecureRandom

require 'securerandom'

SecureRandom.random_number
=> 0.232

SecureRandom.random_number(100)
=> 72

SecureRandom.hex
=> "87694e9e5231aba6ssdfs3de39c58cdfbe307"

不要忘記首先使用srand()為 RNG 設定種子。

使用“ rand”功能就像這樣

rand(10)

您可以使用 ruby rand方法,如下所示:

rand(n+1)

您需要使用n+1作為 rand 方法返回任何大於或等於 0 但小於傳遞的參數值的隨機數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM