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

Cara Menjana Nombor Rawak Tidak Berulang dalam JavaScript tanpa Rekursi

Barbara Streisand
Lepaskan: 2024-10-20 08:03:29
asal
417 orang telah melayarinya

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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!

sumber:php
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan