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
rand
tanpa argumen.
Seperti Marc-André LaFortune menyebutkan dalam jawabannya di bawah ini (pergi upvote itu) , Ruby 1.9.2 memiliki sendiri Random
kelas (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 max
nilai, 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..30
termasuk 30, saya harus membuat angka acak antara 0 dan 11, tidak termasuk 11.
Random
kelas baru , tapi itu ide yang buruk untuk menelepon Random.new
beberapa 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 10
dan 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 Random
kelas 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 rand
atau 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.new
dan menggunakannya di tempat lain.
Kasus dimana Random.new
yang membantu adalah sebagai berikut:
rand
/ Random.rand
bahwa program utama mungkin mengandalkanRandom
objek dapat menyusun)backports
Permata 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.rand
metode kelas tidak menerima berbagai. (Ruby 1.9.2p180)
Jika Anda tidak hanya mencari nomor tetapi juga hex atau uuid, perlu disebutkan bahwa SecureRandom
modul menemukan jalannya dari ActiveSupport
inti 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 rand
metode ini. Argumen yang diteruskan ke rand
metode harus berupa integer
atau 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_number
mengembalikan 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.2
ketika 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.sample
adalah 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#shuffle
metode untuk pengacakan
array = (1..10).to_a
array.shuffle.first
.shuffle.first
dengan .sample
!
srand <some_number>
sebelum menulisrand
kode akan memberi Anda urutan pseudo-acak deterministik (yaitu berulang), jika Anda membutuhkannya. ruby-doc.org/core-2.5.6/Random.html#method-c-srand