Cara Menghasilkan Angka Acak di Ruby

Meskipun tidak ada komputer yang dapat menghasilkan angka acak, Ruby memang memberikan akses ke metode yang akan kembali pseudorandom angka.

Tidak ada komputer yang dapat menghasilkan dengan benar angka acak murni dengan perhitungan. Yang terbaik yang bisa mereka lakukan adalah menghasilkan pseudorandom angka, yang merupakan urutan angka itu muncul acak tetapi tidak.

Bagi pengamat manusia, angka-angka ini memang acak. Tidak akan ada urutan berulang pendek, dan, setidaknya untuk pengamat manusia, mereka tidak akan menyajikan pola yang jelas. Namun, diberikan waktu dan motivasi yang cukup, asli benih dapat ditemukan, urutan diciptakan kembali dan nomor berikutnya dalam urutan ditebak.

Untuk alasan ini, metode yang dibahas dalam artikel ini mungkin tidak boleh digunakan untuk menghasilkan angka yang harus aman secara kriptografi.

Generator nomor pseudorandom harus diunggulkan untuk menghasilkan urutan yang berbeda setiap kali nomor acak baru dihasilkan. Tidak ada metode yang ajaib - angka-angka yang tampaknya acak ini dihasilkan dengan menggunakan algoritma yang relatif sederhana dan aritmatika yang relatif sederhana. Dengan menyemai PRNG, Anda memulainya pada titik yang berbeda setiap saat. Jika Anda tidak seed, itu akan menghasilkan urutan angka yang sama setiap kali.

instagram viewer

Di Ruby, the Kernel # srand Metode dapat dipanggil tanpa argumen. Ini akan memilih seed nomor acak berdasarkan waktu, ID proses dan nomor urut. Cukup dengan menelepon srand di mana saja di awal program Anda, itu akan menghasilkan serangkaian angka acak yang tampaknya berbeda setiap kali Anda menjalankannya. Metode ini disebut secara implisit ketika program dijalankan, dan menaburkan PRNG dengan ID waktu dan proses (tanpa nomor urut).

Setelah program berjalan dan Kernel # srand baik secara implisit atau eksplisit disebut, the Kernel # rand metode dapat dipanggil. Metode ini, disebut tanpa argumen, akan mengembalikan angka acak dari 0 hingga 1. Di masa lalu, angka ini biasanya diskalakan ke jumlah maksimum yang ingin Anda hasilkan dan mungkin to_i memintanya untuk mengubahnya menjadi integer.

Namun, Ruby membuat segalanya lebih mudah jika Anda menggunakan Ruby 1.9.x. Itu Kernel # rand Metode dapat mengambil argumen tunggal. Jika argumen ini adalah a Numerik dalam bentuk apa pun, Ruby akan menghasilkan bilangan bulat dari 0 hingga (dan tidak termasuk) nomor itu.

Namun, bagaimana jika Anda ingin menghasilkan angka dari 10 hingga 15? Biasanya, Anda akan menghasilkan angka dari 0 hingga 5 dan menambahkannya ke 10. Namun, Ruby membuatnya lebih mudah.

Pastikan Anda memperhatikan dua jenis rentang. Jika Anda menelepon rand (10..15), yang akan menghasilkan angka dari 10 hingga 15 termasuk 15. Sedangkan rand (10... 15) (dengan 3 titik) akan menghasilkan angka dari 10 hingga 15 tidak termasuk 15.

Terkadang Anda membutuhkan urutan angka yang tampak acak, tetapi harus menghasilkan urutan yang sama setiap waktu. Misalnya, jika Anda menghasilkan angka acak dalam tes unit, Anda harus menghasilkan urutan angka yang sama setiap kali.

Tes unit yang gagal pada satu urutan harus gagal lagi saat dijalankan berikutnya, jika itu menghasilkan urutan perbedaan di waktu berikutnya, itu mungkin tidak gagal. Untuk melakukan itu, hubungi Kernel # srand dengan nilai yang diketahui dan konstan.

Penerapan Kernel # rand agak tidak Ruby. Itu tidak mengabstraksi PRNG dengan cara apa pun, juga tidak memungkinkan Anda untuk instantiate PRNG. Ada satu keadaan global untuk PRNG yang berbagi kode. Jika Anda mengubah seed atau mengubah status PRNG, itu mungkin memiliki efek yang lebih luas daripada yang Anda perkirakan.

Namun, karena program mengharapkan hasil dari metode ini menjadi acak - itulah tujuannya! - ini mungkin tidak akan menjadi masalah. Hanya jika program mengharapkan untuk melihat urutan angka yang diharapkan, seperti jika dipanggil srand dengan nilai konstan, jika melihat hasil yang tidak terduga.