Pengenalan
Memilih item secara rawak daripada tatasusunan tanpa pengulangan ialah pengaturcaraan biasa tugasan. Walau bagaimanapun, jika kumpulan item sentiasa diubah suai, memastikan kecekapan menjadi penting.
Soalan
Seorang pembangun telah melaksanakan fungsi untuk memilih item secara rawak daripada tatasusunan sambil mengekalkan senarai pilihan terkini untuk mengelakkan pengulangan. Walau bagaimanapun, mereka menyatakan kebimbangan tentang kecekapannya dan bertanya sama ada terdapat pendekatan yang lebih optimum.
Jawab
1. Penjelasan Rekursif
Kod yang disediakan sememangnya kelihatan sebagai fungsi rekursif. Rekursi melibatkan fungsi memanggil dirinya sendiri, yang boleh membawa kepada ketidakcekapan dalam senario tertentu.
2. Peningkatan Kecekapan
Untuk meningkatkan kecekapan, pertimbangkan pendekatan alternatif berikut:
Pelaksanaan Kod:
<code class="javascript">function randomNoRepeats(array) { var copy = array.slice(0); return function() { if (copy.length < 1) { copy = array.slice(0); } var index = Math.floor(Math.random() * copy.length); var item = copy[index]; copy.splice(index, 1); return item; }; } var chooser = randomNoRepeats(['Foo', 'Bar', 'Gah']);</code>
Penjelasan:
Pendekatan ini mengasingkan logik pemilihan rawak daripada kod yang bertanggungjawab untuk menguruskan tatasusunan pilihan terkini. Hasilnya, kecekapan dipertingkatkan kerana pemilihan rawak berlaku hanya sekali setiap larian fungsi pemilih.
Dengan menetapkan semula salinan apabila ia habis, fungsi menjamin bahawa semua item mempunyai peluang yang sama untuk dipilih. Ini menghapuskan kemungkinan isu kod tersekat dalam gelung tak terhingga cuba mencari nama "unik".
Atas ialah kandungan terperinci Bagaimanakah saya boleh memilih item rawak dengan cekap daripada tatasusunan tanpa pengulangan, terutamanya apabila tatasusunan sentiasa diubah suai?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!