Bagaimana saya bisa menghasilkan 8, katakanlah, angka acak unik antara 1 dan 100 menggunakan JavaScript?
Hasilkan permutasi dari 100 angka dan kemudian pilih secara seri. Gunakan Knuth Shuffle (alias the Fisher-Yates shuffle) Algoritma . JavaScript:
KODE DITIPU DARI Tautan. EDIT: Kode yang ditingkatkan:
Masalah potensial: Misalkan kita memiliki array 100 angka {mis. [1,2,3 ... 100]} dan kami berhenti bertukar setelah 8 swap; Maka sebagian besar array waktu akan terlihat seperti {1,2,3,76,5,6,7,8 ,. ..nomor di sini akan dikocok ... 10}. Karena setiap angka akan ditukar dengan probabilitas 1/100 jadi Prob. menukar 8 angka pertama adalah 8/100 sedangkan prob. menukar 92 lainnya adalah 92/100. Tetapi jika kita menjalankan algoritma untuk array penuh maka kita yakin (hampir) setiap entri ditukar. Kalau tidak, kita menghadapi pertanyaan: 8 angka yang harus dipilih? Teknik-teknik di atas baik jika Anda ingin menghindari perpustakaan, tetapi tergantung jika Anda akan baik-baik saja dengan perpustakaan, saya sarankan memeriksa Peluang untuk menghasilkan hal-hal acak dalam JavaScript. Khusus untuk menyelesaikan pertanyaan Anda, menggunakan Peluang semudah:
Penafian, sebagai penulis Chance, saya agak bias;)
Untuk menghindari kerutan yang panjang dan tidak dapat diandalkan, saya akan melakukan yang berikut ...
Voila - tidak ada nomor yang diulang. Saya dapat memposting beberapa kode aktual nanti, jika ada yang tertarik. Sunting: Ini mungkin garis kompetitif dalam diri saya tetapi, setelah melihat posting oleh @Alsciende, saya tidak bisa menahan memposting kode yang saya janjikan.
Solusi JS Modern menggunakan Set (dan kasus rata-rata O (n))
Ini adalah fungsi yang sangat umum yang saya tulis untuk menghasilkan bilangan bulat unik/tidak unik untuk sebuah array. Asumsikan parameter terakhir benar dalam skenario ini untuk jawaban ini.
Di sini 'tempObj' adalah obj yang sangat berguna karena setiap nomor acak yang dihasilkan akan langsung memeriksa tempObj ini jika kunci itu sudah ada, jika tidak, maka kita mengurangi i per satu karena kita perlu 1 kali dijalankan tambahan karena nomor acak saat ini sudah ada . Dalam kasus Anda, jalankan yang berikut ini
Itu saja. Saya akan melakukan ini:
Mengacak angka dari 1 hingga 100 adalah strategi dasar yang tepat, tetapi jika Anda hanya perlu 8 angka acak, Anda tidak perlu mengacak semua 100 angka. Saya tidak tahu Javascript dengan baik, tapi saya percaya mudah untuk membuat array 100 nulls dengan cepat. Kemudian, selama 8 putaran, Anda menukar elemen ke-n dari array (n mulai dari 0) dengan elemen yang dipilih secara acak dari n + 1 hingga 99. Tentu saja, elemen apa pun yang belum terisi berarti bahwa elemen tersebut benar-benar indeks asli ditambah 1, jadi itu sepele untuk faktor masuk. Ketika Anda selesai dengan 8 putaran, 8 elemen pertama dari array Anda akan memiliki 8 angka acak. untuk array dengan lubang seperti ini solusi modifikasi berikut ini bekerja untuk saya :)
Algoritma permutasi yang sama dengan The Machine Charmer, tetapi dengan implementasi prototyped. Lebih cocok untuk sejumlah besar picks. Menggunakan js 1.7 penugasan pemusnahan jika tersedia.
Sunting: Proposisi lain, lebih cocok untuk sejumlah kecil pemetik, berdasarkan jawaban belugabob. Untuk menjamin keunikan, kami menghapus angka yang dipilih dari array.
Jawaban terbaik sebelumnya adalah jawabannya oleh Solusi saya sangat mirip dengan solusinya. Namun, terkadang Anda menginginkan angka acak dalam urutan acak, dan itulah sebabnya saya memutuskan untuk mengirim jawaban. Selain itu, saya menyediakan fungsi umum.
lebih pendek dari jawaban lain yang pernah saya lihat Menggunakan
Menambahkan versi lain yang lebih baik dari kode yang sama (jawaban yang diterima) dengan fungsi JavaScript 1.6 indexOf. Tidak perlu mengulang melalui seluruh array setiap kali Anda memeriksa duplikat.
Versi Javascript yang lebih lama masih dapat menggunakan versi di atas PS: Mencoba menyarankan pembaruan ke wiki tetapi ditolak. Saya masih berpikir itu mungkin bermanfaat bagi orang lain. Ini adalah solusi pribadi saya:
Ini secara acak menghasilkan 8 nilai array unik (antara 0 dan 7), lalu menampilkannya menggunakan kotak peringatan. jika Anda membutuhkan yang lebih unik, Anda harus menghasilkan array (1..100).
kode di atas lebih cepat:
Solusi ini menggunakan hash yang jauh lebih performan O(1) daripada memeriksa apakah berada di dalam array. Ini juga memiliki pemeriksaan ekstra aman. Semoga ini bisa membantu.
Ini dapat menangani menghasilkan hingga 20 digit nomor acak UNIK JS
jsFiddle
Saya pikir metode ini berbeda dari metode yang diberikan di sebagian besar jawaban, jadi saya pikir saya mungkin menambahkan jawaban di sini (meskipun pertanyaannya diajukan 4 tahun yang lalu). Kami menghasilkan 100 angka acak, dan menandai masing-masing dengan angka dari 1 hingga 100. Kemudian kami mengurutkan angka-angka acak yang ditandai ini, dan tag-nya dikacak secara acak. Atau, seperti yang diperlukan dalam pertanyaan ini, seseorang dapat menghapus hanya dengan menemukan 8 teratas nomor acak yang ditandai. Menemukan 8 item teratas lebih murah daripada menyortir seluruh array . Kita harus perhatikan di sini, bahwa algoritma pengurutan memengaruhi algoritma ini. Jika algoritma pengurutan yang digunakan stabil, ada sedikit bias yang mendukung jumlah yang lebih kecil. Idealnya, kami ingin algoritma pengurutan menjadi tidak stabil dan bahkan tidak bias terhadap stabilitas (atau ketidakstabilan) untuk menghasilkan jawaban dengan distribusi probabilitas yang seragam sempurna. Menerapkan ini sebagai generator membuatnya cukup bagus untuk bekerja dengannya. Catatan, implementasi ini berbeda dari yang membutuhkan seluruh array input untuk dikocok terlebih dahulu.
Saya memilih untuk mengimplementasikan Sebagai contoh, fungsi
Alasan lain saya memilih generator alih-alih fungsi yang baru saja mengembalikan array adalah karena Anda mungkin ingin melanjutkan pengambilan sampel hingga beberapa kondisi tertentu. Mungkin saya ingin bilangan prima pertama dari daftar 1.000.000 bilangan acak.
Karena kami bekerja dengan generator, tugas ini sepele
Ini akan terus-menerus mengambil 1 nomor acak pada suatu waktu, Catatan: Jawaban ini pada awalnya dibagikan pada pertanyaan lain yang ditutup sebagai duplikat dari pertanyaan ini. Karena sangat berbeda dari solusi lain yang disediakan di sini, saya memutuskan untuk membagikannya di sini juga Pendekatan lain yang lebih sederhana adalah membuat larik 100 item dengan angka naik dan mengurutkannya secara acak. Ini sebenarnya mengarah ke cuplikan yang sangat singkat dan (menurut saya) sederhana.
Bagaimana kalau menggunakan properti obyek sebagai tabel hash ? Dengan cara ini skenario terbaik Anda adalah dengan hanya mengacak 8 kali. Ini hanya akan efektif jika Anda ingin sebagian kecil dari kisaran angka. Ini juga jauh lebih sedikit memori daripada Fisher-Yates karena Anda tidak perlu mengalokasikan ruang untuk array.
Saya kemudian menemukan bahwa Object.keys (obj) adalah fitur ECMAScript 5 sehingga di atas cukup banyak tidak berguna di internet sekarang. Jangan takut, karena saya membuatnya ECMAScript 3 kompatibel dengan menambahkan fungsi tombol seperti ini.
|