Câu trả lời:
Sử dụng rand(range)
Nếu bạn cần một số nguyên ngẫu nhiên để mô phỏng một cuộn súc sắc sáu mặt, bạn sẽ sử dụng :
1 + rand(6). Một cuộn trong craps có thể được mô phỏng với2 + rand(6) + rand(6).Cuối cùng, nếu bạn chỉ cần một số float ngẫu nhiên, chỉ cần gọi
randmà không có đối số.
Như Marc-André Lafortune đã đề cập trong câu trả lời của mình dưới đây (hãy nêu lên) , Ruby 1.9.2 có Randomlớp riêng (mà chính Marc-André đã giúp gỡ lỗi , do đó, mục tiêu 1.9.2 cho tính năng đó).
Chẳng hạn, trong trò chơi này , nơi bạn cần đoán 10 số , bạn có thể khởi tạo chúng bằng:
10.times.map{ 20 + Random.rand(11) }
#=> [26, 26, 22, 20, 30, 26, 23, 23, 25, 22]
Ghi chú:
Sử dụng Random.new.rand(20..30)(sử dụng Random.new) nói chung sẽ không phải là một ý tưởng tốt, như được giải thích chi tiết (một lần nữa) bởi Marc-André Lafortune , trong câu trả lời của ông (một lần nữa).
Nhưng nếu bạn không sử dụng Random.new, thì phương thức lớprand chỉ lấy một maxgiá trị, chứ không phải là Range, như lan can (về mặt năng lượng) chỉ ra trong nhận xét (và như được ghi lại trong tài liệu choRandom ). Chỉ có phương thức cá thể mới có thể lấy một Range, như được minh họa bằng cách tạo một số ngẫu nhiên có 7 chữ số .
Đây là lý do tại sao tương đương Random.new.rand(20..30)sẽ là 20 + Random.rand(11), kể từ khi Random.rand(int)trở lại “một lớn hơn số nguyên ngẫu nhiên hơn hoặc bằng không và ít hơn so với lập luận .” 20..30bao gồm 30, tôi cần đưa ra một số ngẫu nhiên trong khoảng từ 0 đến 11, ngoại trừ 11.
Randomlớp mới , nhưng đó là một ý tưởng khủng khiếp để gọi Random.newnhiều lần như trong ví dụ của bạn. Tôi đã chỉnh sửa câu trả lời của mình để nói rằng.
Random.rand không chấp nhận một phạm vi, thực sự. (Kể từ ngày 1.9.3, tôi tin.)
Mặc dù bạn có thể sử dụng rand(42-10) + 10để có được một số ngẫu nhiên giữa 10và 42(trong đó 10 bao gồm và 42 độc quyền), có một cách tốt hơn kể từ Ruby 1.9.3, nơi bạn có thể gọi:
rand(10...42) # => 13
Có sẵn cho tất cả các phiên bản của Ruby bằng cách yêu cầu backportsđá quý của tôi .
Ruby 1.9.2 cũng đã giới thiệu Randomlớp để bạn có thể tạo các đối tượng tạo số ngẫu nhiên của riêng mình và có API đẹp:
r = Random.new
r.rand(10...42) # => 22
r.bytes(3) # => "rnd"
Các Randomlớp học riêng của mình hoạt động như một máy phát ngẫu nhiên, vì vậy bạn gọi trực tiếp:
Random.rand(10...42) # => same as rand(10...42)
Ghi chú về Random.new
Trong hầu hết các trường hợp, đơn giản nhất là sử dụng randhoặc Random.rand. Tạo một trình tạo ngẫu nhiên mới mỗi khi bạn muốn một số ngẫu nhiên là một ý tưởng thực sự tồi tệ . Nếu bạn làm điều này, bạn sẽ nhận được các thuộc tính ngẫu nhiên của thuật toán seeding ban đầu rất tàn bạo so với các thuộc tính của chính trình tạo ngẫu nhiên .
Nếu bạn sử dụng Random.new, do đó bạn nên gọi nó càng hiếm khi càng tốt , ví dụ như một lần MyApp::Random = Random.newvà sử dụng nó ở mọi nơi khác.
Các trường hợp Random.newhữu ích là như sau:
rand/ Random.randmà các chương trình chính có thể dựa vàoRandomcó thể lặp lại (dễ dàng như các đối tượng có thể sắp xếp lại)backportsquý của tôi chỉ đơn giản là một tập hợp các phương thức mới đối với RUby 1.8.7, 1.9.1, 1.9.2, nhưng được triển khai trong Ruby. Tôi sử dụng RubySpec để đảm bảo rằng kết quả tương thích với Ruby.
Random.rand(10..42)không hoạt động. Các Random.randphương pháp lớp học không chấp nhận một phạm vi. (Ruby 1.9.2p180)
Nếu bạn không chỉ tìm kiếm một số mà còn hex hoặc uuid, điều đáng nói là SecureRandommô-đun đã tìm được đường ActiveSupportđến lõi ruby trong 1.9.2+. Vì vậy, không cần một khuôn khổ đầy đủ:
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"
Nó được ghi lại ở đây: Ruby 1.9.3 - Mô-đun: SecureRandom (lib / securandom.rb)
SecureRandom.random_number(1000..9999)
SecureRandom.random_number()không có một phạm vi, vì vậy không. Bạn có thể sẽ muốn một cái gì đó như SecureRandom.random_number(10_000)(cho 0-9999) hoặc SecureRandom.random_number(9_000)+1_000(cho 1000-9999).
Bạn có thể tạo một số ngẫu nhiên với randphương thức. Đối số được truyền cho randphương thức phải là một integerhoặc a rangevà trả về một số ngẫu nhiên tương ứng trong phạm vi:
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)bài đọc của bạn rõ ràng hơn câu trả lời hàng đầu rand(6)+1.
Vâng, tôi đã tìm ra nó. Rõ ràng có một hàm dựng sẵn (?) Được gọi là rand:
rand(n + 1)
Nếu ai đó trả lời bằng câu trả lời chi tiết hơn, tôi sẽ đánh dấu đó là câu trả lời đúng.
Câu trả lời đơn giản nhất cho câu hỏi:
rand(0..n)
rand(6) #=> gives a random number between 0 and 6 inclusively
rand(1..6) #=> gives a random number between 1 and 6 inclusively
Lưu ý rằng tùy chọn phạm vi chỉ khả dụng trong các phiên bản ruby mới hơn (1.9+ tôi tin).
ruby 1.9.3+. Nó đã không hoạt động 1.9.2khi tôi cố gắng ít nhất.
phạm vi = 10,50
rand (phạm vi)
hoặc là
phạm vi.to_a.sample
hoặc là
range.to_a.shuffle (điều này sẽ xáo trộn toàn bộ mảng và bạn có thể chọn một số ngẫu nhiên bằng cách đầu tiên hoặc cuối cùng hoặc bất kỳ từ mảng này để chọn một ngẫu nhiên)
range.to_a.samplelà một ý tưởng khủng khiếp khi mẫu lớn.
bạn có thể làm rand (phạm vi)
x = rand(1..5)
Liên kết này sẽ hữu ích về việc này;
http://ruby-doc.org/core-1.9.3/Random.html
Và một số rõ ràng hơn dưới đây về các số ngẫu nhiên trong ruby;
Tạo một số nguyên từ 0 đến 10
puts (rand() * 10).to_i
Tạo số từ 0 đến 10 Theo cách dễ đọc hơn
puts rand(10)
Tạo số từ 10 đến 15 Bao gồm 15
puts rand(10..15)
Số ngẫu nhiên không ngẫu nhiên
Tạo cùng một dãy số mỗi khi chương trình được chạy
srand(5)
Tạo 10 số ngẫu nhiên
puts (0..10).map{rand(0..10)}
Có lẽ nó giúp bạn. Tôi sử dụng điều này trong ứng dụng của tôi
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
Việc này ổn với tôi
Cái này thì sao?
num = Random.new
num.rand(1..n)
Thử array#shufflephương pháp ngẫu nhiên
array = (1..10).to_a
array.shuffle.first
.shuffle.firstbằng .sample!
srand <some_number>trước khi viếtrandmã sẽ cung cấp cho bạn một chuỗi giả ngẫu nhiên xác định (nghĩa là có thể lặp lại), nếu bạn cần điều đó. ruby-doc.org/core-2.5.6/Random.html#method-c-srand