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
rand
mà 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ó Random
lớ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 max
giá 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..30
bao 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.
Random
lớp mới , nhưng đó là một ý tưởng khủng khiếp để gọi Random.new
nhiề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 10
và 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 Random
lớ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 Random
lớ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 rand
hoặ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.new
và sử dụng nó ở mọi nơi khác.
Các trường hợp Random.new
hữu ích là như sau:
rand
/ Random.rand
mà các chương trình chính có thể dựa vàoRandom
có thể lặp lại (dễ dàng như các đối tượng có thể sắp xếp lại)backports
quý 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.rand
phươ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à SecureRandom
mô-đ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 rand
phương thức. Đối số được truyền cho rand
phương thức phải là một integer
hoặc a range
và 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.2
khi 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.sample
là 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#shuffle
phương pháp ngẫu nhiên
array = (1..10).to_a
array.shuffle.first
.shuffle.first
bằng .sample
!
srand <some_number>
trước khi viếtrand
mã 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