Hướng dẫn random number not repeat javascript - số ngẫu nhiên không lặp lại javascript

Nếu tôi hiểu đúng thì bạn chỉ đang tìm kiếm một hoán vị [nghĩa là các số được chọn ngẫu nhiên không có lặp lại] của các số 1-10? Có thể thử tạo một danh sách ngẫu nhiên của những con số đó, một lần, khi bắt đầu, và sau đó chỉ cần làm việc theo cách của bạn thông qua những thứ đó?

Điều này sẽ tính toán một hoán vị ngẫu nhiên của các số trong

nums = [2,4,6,8,10,12,14,16,18,20];
0:

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];
}

Vì vậy, ví dụ, nếu bạn đang tìm kiếm các số ngẫu nhiên trong khoảng từ 1 - 20 cũng thậm chí, thì bạn có thể sử dụng:

nums = [2,4,6,8,10,12,14,16,18,20];

Sau đó, chỉ cần đọc qua

nums = [2,4,6,8,10,12,14,16,18,20];
1 để nhớ lại các số ngẫu nhiên.

Điều này không có rủi ro về việc nó ngày càng mất nhiều thời gian hơn để tìm những con số không sử dụng, như bạn đã tìm thấy trong cách tiếp cận của mình.

Chỉnh sửa: Sau khi đọc bài này và chạy thử nghiệm trên JSPERF, có vẻ như một cách tốt hơn nhiều để làm điều này là một Fisher, Yates Shuffle:: After reading this and running a test on jsperf, it seems like a much better way of doing this is a Fisher–Yates Shuffle:

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]];

Về cơ bản, nó hiệu quả hơn bằng cách tránh sử dụng các hoạt động mảng 'đắt tiền'.

Chỉnh sửa tiền thưởng: Một khả năng khác là sử dụng máy phát điện [giả sử bạn có hỗ trợ]:: Another possibility is using generators [assuming you have support]:

function* shuffle[array] {

    var i = array.length;

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

}

Sau đó để sử dụng:

var ranNums = shuffle[[1,2,3,4,5,6,7,8,9,10]];

ranNums.next[].value;    // first random number from array
ranNums.next[].value;    // second random number from array
ranNums.next[].value;    // etc.

Trong đó

nums = [2,4,6,8,10,12,14,16,18,20];
2 cuối cùng sẽ đánh giá đến
nums = [2,4,6,8,10,12,14,16,18,20];
3 sau khi bạn chạy qua tất cả các yếu tố trong mảng bị xáo trộn.

Nhìn chung, điều này sẽ không hiệu quả như Fisher, Yates Shuffle vì bạn vẫn còn ____ 14-ing một mảng. Nhưng sự khác biệt là bây giờ bạn chỉ làm công việc đó khi bạn cần thay vì thực hiện tất cả, vì vậy tùy thuộc vào trường hợp sử dụng của bạn, điều này có thể tốt hơn.

Backstory: Khi tôi đang thực hiện một trong những dự án phụ của mình, một trong những nhiệm vụ là hiển thị ảnh từ API hủy bỏ trong nhiều thẻ. Mục tiêu là chọn ảnh ngẫu nhiên mà không lặp lại chúng. Tôi đã sử dụng

nums = [2,4,6,8,10,12,14,16,18,20];
5 cũ để chọn ảnh ngẫu nhiên từ phản hồi của API. Nhưng vấn đề là thường có ít con số lặp lại, do đó có cùng một hình ảnh trong các thẻ khác nhau. when I was doing one of my side projects, one of the tasks was to display photos from Unspash API in multiple cards. Goal was to pick photos randomly without repeating them. I used good old
nums = [2,4,6,8,10,12,14,16,18,20];
5 to randomly pick photos from API's response. But the problem was that often few numbers were repeating, thus there were the same pictures in different cards.

Giả sử bạn muốn tạo 5 số duy nhất ngẫu nhiên từ 1 đến 10. Cơ hội lớn mà bạn sẽ nhận được ít nhất một số lặp lại.

Giải pháp cho nhiệm vụ này là thay thế từng số được chọn [ngẫu nhiên] trong mảng bằng một số không được sử dụng khác.

Trong mã, đây sẽ là một cái gì đó như thế này:

function randomUniqueNum[range, outputCount] {

  let arr = []
  for [let i = 1; i 

Bài Viết Liên Quan

Chủ Đề