[英]How to get a random number in Ruby
如何生成0
和n
之間的隨機數?
來自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 之間20..30
一個隨機數,不包括 11。
雖然你可以使用rand(42-10) + 10
獲得之間的隨機數10
和42
(其中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
注釋
在大多數情況下,最簡單的方法是使用rand
或Random.rand
。 每次您想要一個隨機數時都創建一個新的隨機生成器是一個非常糟糕的主意。 如果您這樣做,您將獲得初始種子算法的隨機屬性,與隨機生成器本身的屬性相比,這是非常糟糕的。
如果你使用Random.new
,你應該盡可能少地調用它,例如一次作為MyApp::Random = Random.new
並在其他任何地方使用它。
Random.new
有用的情況如下:
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"
您可以使用rand
方法生成一個隨機數。 傳遞給rand
方法的參數應該是integer
或range
,並返回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
這對我來說可以
這個怎么樣?
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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.