Mengapa runif tidak menghasilkan hasil yang sama setiap waktu?

11

Mengapa generator angka acak seperti runif()di R tidak menghasilkan hasil yang sama setiap waktu?

Sebagai contoh:

X <- runif(100)
X

menghasilkan output yang berbeda setiap saat.

Apa alasan untuk menghasilkan keluaran yang berbeda setiap saat?

Fungsionalitas apa yang terjadi di latar belakang untuk melakukan ini?

Himabindu Kunani
sumber
3
Salah satu cara untuk memikirkan ini adalah dengan bertanya pada diri sendiri: "apakah Anda ingin generator nomor acak Anda menghasilkan angka yang sama setiap waktu?"
shadowtalker
2
@ssdecontrol: Lihat Dilbert
Henry
2
Atau xkcd
Henry

Jawaban:

18

Pada dasarnya ini bukan hanya pertanyaan R; ini berkaitan dengan pembuatan angka acak secara lebih umum.

Angka "acak" sangat penting di banyak bagian statistik. Kami membutuhkan nilai acak yang kami hasilkan untuk memiliki properti tertentu, dan (biasanya) banyak upaya untuk membangun generator bilangan acak dan memeriksa propertinya.

Idenya adalah kita ingin mendapatkan urutan nilai yang merupakan proksi yang baik untuk angka acak. Pekerja keras yang biasa menghasilkan bilangan acak adalah distribusi seragam (dari situ kami membuat yang lain, seperti bilangan acak Gaussian).

Jadi (paling khas) algoritma numerik digunakan untuk membangun urutan bilangan bulat, masing-masing dalam hal beberapa fungsi yang sebelumnya. Bilangan bulat ini kemudian diskalakan untuk berada di antara 0 dan 1 (biasanya ).[0,1)

Misalnya, banyak yang hanya bekerja pada yang sebelumnya:

x1=f(x0)z1=x1/mx2=f(x1)z2=x2/mx3=f(x2)z3=x3/m

... di mana adalah bilangan bulat, kemudian diskalakan agar berada dalam interval satuan, dan adalah beberapa fungsi yang sering rumit tetapi biasanya cepat yang beroperasi pada bit dalam argumennya untuk menghasilkan serangkaian bit baru bahwa (semoga) tampaknya tidak terkait dengan nilai-nilai sebelumnya (jika kita melihatnya dengan segala macam cara, bahkan dengan sangat hati-hati - meskipun mereka benar-benar terkait, karena itulah yang dibuatnya). Ini harus dibangun dengan hati-hati untuk memastikan urutan memiliki siklus yang sangat panjang dan bahwa nilainya benar-benar seragam dan tidak tergantung secara berurutan dengan cara apa pun yang mungkin benar-benar kita pedulikan (bersama dengan sejumlah persyaratan lain yang biasanya dianggap sebagai penting).z fxzf

Mereka membutuhkan integer awal ("seed") ( ), yang Anda berikan (beberapa algoritma mungkin membutuhkan lebih dari satu seed). Jika Anda menggunakan benih yang sama lagi, Anda mendapatkan urutan yang sama (yang berguna untuk dapat mereproduksi hasil). Tetapi kadang-kadang, Anda hanya ingin beberapa angka acak, dan Anda tidak peduli berapa benih asalkan titik awalnya berbeda dari lot sebelumnya yang Anda gunakan.x0

Jadi, jika Anda tidak menyediakan benih, banyak paket bisa membuatkannya untuk Anda. Beberapa paket melihat beberapa digit terakhir pada jam digital internal (biasanya dimanipulasi dalam beberapa cara). Beberapa (termasuk R) menyimpan nilai terakhir (bilangan bulat atas, lebih umum istilah "negara" digunakan untuk membahas kasus di mana ada lebih dari satu nomor yang terlibat) yang dihasilkan oleh generator nomor acak untuk digunakan sebagai seed berikutnya jika Anda tidak menyediakannya.x3

Lihat ?runifdi R dan Anda akan mencatat bahwa itu menjelaskan tentang keberadaan benih acak, dengan tautan ke bantuan ?.Random.seedyang menjelaskan jumlah besar generator nomor acak yang tersedia di R (Anda bahkan dapat memasok sendiri). Halaman bantuan yang sama menjelaskan bahwa jika Anda belum pernah menggunakan generasi nomor acak sebelum atau mengatur seed, untuk memulai dengan seed diambil dari jam, dan setelah itu nilai sebelumnya disimpan (sehingga nomor acak berikutnya yang Anda dapatkan akan menjadi yang sama yang Anda peroleh jika Anda menghasilkan satu nilai lagi terakhir kali - ini mengingat "di mana Anda sampai").

Fungsi runifdalam R (seperti beberapa rutinitas pembangkitan angka acak lainnya dalam paket lain yang biasanya dapat melakukan hal serupa) tahu tentang tempat penyimpanan nomor acak. Itu terus memperbarui nilai itu saat berjalan. Jadi ia dapat beroperasi tanpa harus secara eksplisit melewati sebuah seed, tetapi masih menggunakan satu; jika Anda tidak memberikannya, itu hanya menggunakan yang disimpan terakhir.

Adapun mengapa ia memberikan output yang berbeda setiap kali (jika Anda tidak mengatakannya untuk memberikan urutan yang sama): ia melakukan ini karena nilai yang sama setiap kali biasanya sangat kontra produktif - tidak akan memiliki sifat yang berulang Pengambilan sampel secara acak, sehingga tidak terlalu berguna untuk putpos yang kita gunakan untuk penghasil bilangan acak.

Glen_b -Reinstate Monica
sumber
14

Anda harus mengatur seed acak untuk mendapatkan hasil yang sama setiap kali. Gunakan ? Set.seed untuk melakukannya. Mempertimbangkan:

> runif(1)
[1] 0.6467259
> runif(1)
[1] 0.2101857
> set.seed(1)
> runif(1)
[1] 0.2655087
> set.seed(1)
> runif(1)
[1] 0.2655087

Anda mungkin tertarik membaca ini: Alasan menggunakan fungsi set.seed .

gung - Pasang kembali Monica
sumber
3
Meskipun ini menjelaskan mekanisme mereproduksi serangkaian hasil, tampaknya tidak menjawab pertanyaan itu sendiri, yang bertanya-tanya mengapa perilaku semacam ini tidak otomatis.
whuber
@whuber, saya pikir pertanyaannya bukan pada-topik jarak jauh di sini. Saya memilih untuk menutup secara instan & akan langsung menutupnya jika saya memiliki hak istimewa itu. Saya memposting ini sehingga OP tidak akan menjadi tangan kosong.
gung - Reinstate Monica
jalankan "set.seed (1)" setiap kali.
Nip