Rumah  >  Artikel  >  hujung hadapan web  >  Bagaimanakah saya boleh memilih item rawak dengan cekap daripada tatasusunan tanpa pengulangan, terutamanya apabila tatasusunan sentiasa diubah suai?

Bagaimanakah saya boleh memilih item rawak dengan cekap daripada tatasusunan tanpa pengulangan, terutamanya apabila tatasusunan sentiasa diubah suai?

Susan Sarandon
Susan Sarandonasal
2024-11-01 17:16:02493semak imbas

How can I efficiently select random items from an array without repetition, especially when the array is constantly being modified?

Pemilihan Rawak yang Cekap daripada Tatasusunan

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:

  1. Buat salinan tatasusunan asal. Ini memastikan tatasusunan asal kekal utuh.
  2. Tentukan fungsi yang secara rawak memilih item daripada salinan.
  3. Apabila salinan sudah habis, tetapkan semula dengan mencipta salinan baharu daripada tatasusunan asal.

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn