Jawaban:
Menggunakan rand(range)
Dari Ruby Random Numbers :
Jika Anda membutuhkan integer acak untuk mensimulasikan gulungan mati enam sisi, Anda akan menggunakan:
1 + rand(6). Gulungan craps dapat disimulasikan dengan2 + rand(6) + rand(6).Akhirnya, jika Anda hanya perlu float acak, panggil saja
randtanpa argumen.
Seperti Marc-André LaFortune menyebutkan dalam jawabannya di bawah ini (pergi upvote itu) , Ruby 1.9.2 memiliki sendiri Randomkelas (yang Marc-André dirinya membantu untuk debug , maka sasaran 1.9.2 untuk fitur itu).
Misalnya, dalam game ini Anda harus menebak 10 angka , Anda dapat menginisialisasi dengan:
10.times.map{ 20 + Random.rand(11) }
#=> [26, 26, 22, 20, 30, 26, 23, 23, 25, 22]
catatan:
Menggunakan Random.new.rand(20..30)(menggunakan Random.new) umumnya tidak akan menjadi ide yang baik, seperti yang dijelaskan secara rinci (lagi) oleh Marc-André Lafortune , dalam jawabannya (lagi).
Tetapi jika Anda tidak menggunakan Random.new, maka metode kelasrand hanya mengambil maxnilai, bukan a Range, seperti yang ditunjukkan oleh banister (penuh semangat) dalam komentar (dan seperti yang didokumentasikan dalam dokumen untukRandom ). Hanya metode instance yang dapat mengambil Range, seperti yang diilustrasikan oleh menghasilkan angka acak dengan 7 digit .
Inilah sebabnya mengapa setara dengan Random.new.rand(20..30)itu 20 + Random.rand(11), karena Random.rand(int)mengembalikan "bilangan bulat acak lebih besar dari atau sama dengan nol dan kurang dari argumen ." 20..30termasuk 30, saya harus membuat angka acak antara 0 dan 11, tidak termasuk 11.
Randomkelas baru , tapi itu ide yang buruk untuk menelepon Random.newbeberapa kali seperti pada contoh Anda. Saya sudah mengedit jawaban saya untuk menyatakan itu.
Random.rand memang menerima rentang, sebenarnya. (Sejak 1.9.3, saya percaya.)
Meskipun bisa digunakan rand(42-10) + 10 untuk mendapatkan nomor acak antara 10dan 42(di mana 10 inklusif dan 42 eksklusif), ada cara yang lebih baik sejak Ruby 1.9.3, tempat Anda dapat menelepon:
rand(10...42) # => 13
Tersedia untuk semua versi Ruby dengan meminta saya backports permata .
Ruby 1.9.2 juga memperkenalkan Randomkelas sehingga Anda dapat membuat objek penghasil angka acak Anda sendiri dan memiliki API yang bagus:
r = Random.new
r.rand(10...42) # => 22
r.bytes(3) # => "rnd"
Itu Random kelas itu sendiri bertindak sebagai generator acak, sehingga Anda menghubungi langsung:
Random.rand(10...42) # => same as rand(10...42)
Catatan aktif Random.new
Dalam kebanyakan kasus, yang paling sederhana adalah menggunakan randatau Random.rand. Membuat generator acak baru setiap kali Anda menginginkan nomor acak adalah ide yang sangat buruk . Jika Anda melakukan ini, Anda akan mendapatkan properti acak dari algoritma seeding awal yang mengerikan dibandingkan dengan properti generator acak itu sendiri .
Jika Anda menggunakan Random.new, Anda harus menyebutnya sesering mungkin , misalnya sekali MyApp::Random = Random.newdan menggunakannya di tempat lain.
Kasus dimana Random.new yang membantu adalah sebagai berikut:
rand / Random.randbahwa program utama mungkin mengandalkanRandomobjek dapat menyusun)backportsPermata saya hanyalah kumpulan metode yang baru untuk RUby 1.8.7, 1.9.1, 1.9.2, tetapi diimplementasikan di Ruby. Saya menggunakan RubySpec untuk memastikan bahwa hasilnya kompatibel dengan Ruby.
Random.rand(10..42)tidak bekerja. The Random.randmetode kelas tidak menerima berbagai. (Ruby 1.9.2p180)
Jika Anda tidak hanya mencari nomor tetapi juga hex atau uuid, perlu disebutkan bahwa SecureRandommodul menemukan jalannya dari ActiveSupportinti ruby di 1.9.2+. Jadi tanpa perlu kerangka penuh sesak nafas:
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"
Ini didokumentasikan di sini: Ruby 1.9.3 - Modul: SecureRandom (lib / securerandom.rb)
SecureRandom.random_number(1000..9999)
SecureRandom.random_number()tidak mengambil rentang, jadi tidak. Anda mungkin menginginkan sesuatu seperti SecureRandom.random_number(10_000)(untuk 0-9999) atau SecureRandom.random_number(9_000)+1_000(untuk 1000-9999).
Anda dapat menghasilkan angka acak dengan randmetode ini. Argumen yang diteruskan ke randmetode harus berupa integeratau range, dan mengembalikan nomor acak yang sesuai dalam rentang:
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)bacaan Anda lebih jelas daripada jawaban teratas rand(6)+1.
Yah, aku sudah menemukannya. Rupanya ada fungsi builtin (?) Yang disebut rand:
rand(n + 1)
Jika seseorang menjawab dengan jawaban yang lebih terperinci, saya akan menandainya sebagai jawaban yang benar.
Jawaban paling sederhana untuk pertanyaan:
rand(0..n)
Anda cukup menggunakan random_number.
Jika bilangan bulat positif diberikan sebagai n, random_numbermengembalikan bilangan bulat: 0 <=random_number <n.
Gunakan seperti ini:
any_number = SecureRandom.random_number(100)
Output akan berupa angka antara 0 dan 100.
rand(6) #=> gives a random number between 0 and 6 inclusively
rand(1..6) #=> gives a random number between 1 and 6 inclusively
Perhatikan bahwa opsi rentang hanya tersedia di versi ruby yang lebih baru (1,9+ saya percaya).
ruby 1.9.3+. Itu tidak berhasil 1.9.2ketika saya mencoba setidaknya.
range = 10..50
rand (range)
atau
range.to_a.sample
atau
range.to_a.shuffle (ini akan mengacak seluruh array dan Anda dapat memilih nomor acak dengan yang pertama atau terakhir atau yang lainnya dari array ini untuk memilih yang acak)
range.to_a.sampleadalah ide yang buruk ketika sampel besar.
Anda dapat melakukan rand (range)
x = rand(1..5)
Tautan ini akan membantu mengenai hal ini;
http://ruby-doc.org/core-1.9.3/Random.html
Dan beberapa kejelasan lagi di bawah ini atas angka acak di ruby;
Hasilkan integer dari 0 hingga 10
puts (rand() * 10).to_i
Hasilkan angka dari 0 hingga 10 Dengan cara yang lebih mudah dibaca
puts rand(10)
Hasilkan angka dari 10 hingga 15 Termasuk 15
puts rand(10..15)
Angka Acak Non-Acak
Hasilkan urutan angka yang sama setiap kali program dijalankan
srand(5)
Hasilkan 10 angka acak
puts (0..10).map{rand(0..10)}
Mungkin itu membantu Anda. Saya menggunakan ini di aplikasi saya
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
Ini bekerja dengan baik untuk saya
Bagaimana dengan yang ini?
num = Random.new
num.rand(1..n)
Coba array#shufflemetode untuk pengacakan
array = (1..10).to_a
array.shuffle.first
.shuffle.firstdengan .sample!
srand <some_number>sebelum menulisrandkode akan memberi Anda urutan pseudo-acak deterministik (yaitu berulang), jika Anda membutuhkannya. ruby-doc.org/core-2.5.6/Random.html#method-c-srand