Bagaimana cara menghasilkan angka acak antara 0
dan n
?
ruby-on-rails
ruby
ruby-on-rails-3
ruby-on-rails-4
random
Mark A. Nicolosi
sumber
sumber
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-srandJawaban:
Menggunakan
rand(range)
Dari Ruby Random Numbers :
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:
catatan:
Menggunakan
Random.new.rand(20..30)
(menggunakanRandom.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 mengambilmax
nilai, bukan aRange
, seperti yang ditunjukkan oleh banister (penuh semangat) dalam komentar (dan seperti yang didokumentasikan dalam dokumen untukRandom
). Hanya metode instance yang dapat mengambilRange
, seperti yang diilustrasikan oleh menghasilkan angka acak dengan 7 digit .Inilah sebabnya mengapa setara dengan
Random.new.rand(20..30)
itu20 + Random.rand(11)
, karenaRandom.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.sumber
Random
kelas baru , tapi itu ide yang buruk untuk meneleponRandom.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 antara10
dan42
(di mana 10 inklusif dan 42 eksklusif), ada cara yang lebih baik sejak Ruby 1.9.3, tempat Anda dapat menelepon: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:Itu
Random
kelas itu sendiri bertindak sebagai generator acak, sehingga Anda menghubungi langsung:Catatan aktif
Random.new
Dalam kebanyakan kasus, yang paling sederhana adalah menggunakan
rand
atauRandom.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 sekaliMyApp::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)sumber
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. TheRandom.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 dariActiveSupport
inti ruby di 1.9.2+. Jadi tanpa perlu kerangka penuh sesak nafas:Ini didokumentasikan di sini: Ruby 1.9.3 - Modul: SecureRandom (lib / securerandom.rb)
sumber
SecureRandom.random_number(1000..9999)
SecureRandom.random_number()
tidak mengambil rentang, jadi tidak. Anda mungkin menginginkan sesuatu sepertiSecureRandom.random_number(10_000)
(untuk 0-9999) atauSecureRandom.random_number(9_000)+1_000
(untuk 1000-9999).Anda dapat menghasilkan angka acak dengan
rand
metode ini. Argumen yang diteruskan kerand
metode harus berupainteger
ataurange
, dan mengembalikan nomor acak yang sesuai dalam rentang:sumber
rand(1..6)
bacaan Anda lebih jelas daripada jawaban teratasrand(6)+1
.Yah, aku sudah menemukannya. Rupanya ada fungsi builtin (?) Yang disebut rand:
Jika seseorang menjawab dengan jawaban yang lebih terperinci, saya akan menandainya sebagai jawaban yang benar.
sumber
Bagaimana dengan ini?
sumber
rand
O (1).Jawaban paling sederhana untuk pertanyaan:
sumber
Anda cukup menggunakan
random_number
.Jika bilangan bulat positif diberikan sebagai n,
random_number
mengembalikan bilangan bulat: 0 <=random_number
<n.Gunakan seperti ini:
Output akan berupa angka antara 0 dan 100.
sumber
Perhatikan bahwa opsi rentang hanya tersedia di versi ruby yang lebih baru (1,9+ saya percaya).
sumber
ruby 1.9.3+
. Itu tidak berhasil1.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)
sumber
range.to_a.sample
adalah ide yang buruk ketika sampel besar.Anda dapat melakukan rand (range)
sumber
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
Hasilkan angka dari 0 hingga 10 Dengan cara yang lebih mudah dibaca
Hasilkan angka dari 10 hingga 15 Termasuk 15
Angka Acak Non-Acak
Hasilkan urutan angka yang sama setiap kali program dijalankan
Hasilkan 10 angka acak
sumber
Cara mudah untuk mendapatkan nomor acak di ruby adalah,
sumber
Mungkin itu membantu Anda. Saya menggunakan ini di aplikasi saya
https://github.com/rubyworks/facets/blob/5569b03b4c6fd25897444a266ffe25872284be2b/lib/core/facets/string/random.rb
Ini bekerja dengan baik untuk saya
sumber
Bagaimana dengan yang ini?
sumber
Coba
array#shuffle
metode untuk pengacakansumber
.shuffle.first
dengan.sample
!Jangan lupa untuk menaburkan RNG dengan srand () terlebih dahulu.
sumber