Rumah  >  Artikel  >  hujung hadapan web  >  Cara Menjana Nombor Rawak Tidak Berulang dalam JavaScript tanpa Rekursi

Cara Menjana Nombor Rawak Tidak Berulang dalam JavaScript tanpa Rekursi

Barbara Streisand
Barbara Streisandasal
2024-10-20 08:03:29307semak imbas

How to Generate Non-Repeating Random Numbers in JavaScript without Recursion

Menjana Nombor Rawak Tidak Berulang dalam JavaScript

Matlamat tugas ini adalah untuk menjana jujukan nombor rawak dalam julat tertentu yang tidak berulang. Satu pendekatan melibatkan menyemak setiap nombor yang dijana berbanding senarai nombor yang dibuat sebelum ini. Walau bagaimanapun, kaedah ini boleh membawa kepada "RangeError" disebabkan pengulangan yang berlebihan.

Penyelesaian yang lebih baik ialah menjana pilih atur rawak bagi nombor yang dikehendaki di hadapan. Ini boleh dicapai menggunakan pelbagai teknik:

Permutasi Rawak

<code class="javascript">var nums = [1,2,3,4,5,6,7,8,9,10],
    ranNums = [],
    i = nums.length,
    j = 0;

while (i--) {
    j = Math.floor(Math.random() * (i+1));
    ranNums.push(nums[j]);
    nums.splice(j,1);
}</code>

Algoritma ini menjana susunan rawak nombor dalam nombor. Jika anda ingin mengehadkan julat atau menentukan nombor genap, anda boleh mengubah suai nombor dengan sewajarnya.

Fisher-Yates Shuffle

<code class="javascript">function shuffle(array) {
    var i = array.length,
        j = 0,
        temp;

    while (i--) {

        j = Math.floor(Math.random() * (i+1));

        // swap randomly chosen element with current element
        temp = array[i];
        array[i] = array[j];
        array[j] = temp;

    }

    return array;
}

var ranNums = shuffle([1,2,3,4,5,6,7,8,9,10]);</code>

Fisher-Yates Shuffle ialah alternatif yang lebih cekap kepada rawak kaedah pilih atur, kerana ia mengelakkan penggunaan operasi tatasusunan yang mahal.

Penjana

<code class="javascript">function* shuffle(array) {

    var i = array.length;

    while (i--) {
        yield array.splice(Math.floor(Math.random() * (i+1)), 1)[0];
    }

}</code>

Penjana menawarkan pilihan yang lebih dinamik. Dengan menggunakan hasil dan kaedah seterusnya, anda boleh mengakses nombor yang dikocok atas permintaan tanpa pra-menjana keseluruhan jujukan.

Pendekatan ini amat berguna dalam kes di mana anda memerlukan sejumlah besar nombor rawak dan ingin mengelak menyimpan semuanya dalam ingatan sekali gus.

Atas ialah kandungan terperinci Cara Menjana Nombor Rawak Tidak Berulang dalam JavaScript tanpa Rekursi. 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