Random không trùng trong javascript

Nếu tôi hiểu đúng thì bạn chỉ đang tìm một hoán vị (tức là các số được ngẫu nhiên hóa không có số lặp lại) của các số từ 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, ngay từ đầu, và sau đó chỉ làm việc theo cách của bạn thông qua những con số đó?

Đ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:

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 từ 1 đến 20 cũng là số chẵn, 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 ranNumsđể nhớ lại các số ngẫu nhiên.

Điều này không có nguy cơ mất nhiều thời gian hơn để tìm các số chưa 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ư cách tốt hơn nhiều để làm điều này là 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 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ợ ):

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.

nơi ranNums.next().valuecuối cùng sẽ đánh giá undefinedkhi bạn đã chạy qua tất cả các phần tử trong mảng 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 đang điều khiển splicemộ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ì làm tất cả trướ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.

43 hữu ích 0 bình luận chia sẻ

var items = Array(523,3452,334,31,...5346);

Làm thế nào để tôi có được mục ngẫu nhiên từ items?

  • javascript
  • arrays
  • random

711 hữu ích 5 bình luận 585k xem chia sẻ

answer

1582

Random không trùng trong javascript

var item = items[Math.floor(Math.random()*items.length)];

1582 hữu ích 5 bình luận chia sẻ

answer

92

Random không trùng trong javascript

Nếu bạn thực sự phải sử dụng jQuery để giải quyết vấn đề này:

(function($) {
    $.rand = function(arg) {
        if ($.isArray(arg)) {
            return arg[$.rand(arg.length)];
        } else if (typeof arg === "number") {
            return Math.floor(Math.random() * arg);
        } else {
            return 4;  // chosen by fair dice roll
        }
    };
})(jQuery);

var items = [523, 3452, 334, 31, ..., 5346];
var item = jQuery.rand(items);

Plugin này sẽ trả về một phần tử ngẫu nhiên nếu được cung cấp một mảng hoặc giá trị từ [0 .. n) được cung cấp một số hoặc cho bất kỳ thứ gì khác, một giá trị ngẫu nhiên được đảm bảo!

Để thêm phần thú vị, việc trả về mảng được tạo bằng cách gọi hàm đệ quy dựa trên độ dài của mảng :)

Bản demo hoạt động tại http://jsfiddle.net/2eyQX/

92 hữu ích 5 bình luận chia sẻ

answer

85

Random không trùng trong javascript

Sử dụng dấu gạch dưới (hoặc loDash :)):

var randomArray = [
   '#cc0000','#00cc00', '#0000cc'
];

// use _.sample
var randomElement = _.sample(randomArray);

// manually use _.random
var randomElement = randomArray[_.random(randomArray.length-1)];

Hoặc để xáo trộn toàn bộ một mảng:

// use underscore's shuffle function
var firstRandomElement = _.shuffle(randomArray)[0];

85 hữu ích 5 bình luận chia sẻ

answer

37

Random không trùng trong javascript

var random = items[Math.floor(Math.random()*items.length)]

37 hữu ích 0 bình luận chia sẻ

answer

34

Random không trùng trong javascript

1. giải pháp: xác định nguyên mẫu Array

Array.prototype.random = function () {
  return this[Math.floor((Math.random()*this.length))];
}

nó sẽ hoạt động trên mảng nội tuyến

[2,3,5].random()

và tất nhiên các mảng được xác định trước

list = [2,3,5]
list.random()

2. giải pháp: xác định chức năng tùy chỉnh chấp nhận danh sách và trả về phần tử

get_random = function (list) {
  return list[Math.floor((Math.random()*list.length))];
} 

get_random([2,3,5])

34 hữu ích 3 bình luận chia sẻ

answer

26

Random không trùng trong javascript

Đây là một cách khác:

function rand(items) {
    return items[~~(items.length * Math.random())];
}

26 hữu ích 5 bình luận chia sẻ

answer

14

Random không trùng trong javascript

jQuery là JavaScript! Nó chỉ là một khung JavaScript. Vì vậy, để tìm một mục ngẫu nhiên, chỉ cần sử dụng JavaScript cũ đơn giản, ví dụ:

var randomItem = items[Math.floor(Math.random()*items.length)]

14 hữu ích 0 bình luận chia sẻ

answer

11

Random không trùng trong javascript

var rndval=items[Math.floor(Math.random()*items.length)];

11 hữu ích 0 bình luận chia sẻ

answer

8

Random không trùng trong javascript

var items = Array(523,3452,334,31,...5346);

function rand(min, max) {
  var offset = min;
  var range = (max - min) + 1;

  var randomNumber = Math.floor( Math.random() * range) + offset;
  return randomNumber;
}


randomNumber = rand(0, items.length - 1);

randomItem = items[randomNumber];

tín dụng:

Chức năng Javascript: Trình tạo số ngẫu nhiên

8 hữu ích 1 bình luận chia sẻ

answer

7

Random không trùng trong javascript

// 1. Random shuffle items
items.sort(function() {return 0.5 - Math.random()})

// 2. Get first item
var item = items[0]

Ngắn hơn:

var item = items.sort(function() {return 0.5 - Math.random()})[0];

7 hữu ích 3 bình luận chia sẻ

answer

4

Random không trùng trong javascript

Nếu bạn đang sử dụng node.js, bạn có thể sử dụng mảng duy nhất ngẫu nhiên . Nó chỉ đơn giản là chọn một cái gì đó ngẫu nhiên từ một mảng.

4 hữu ích 0 bình luận chia sẻ

answer

2

Random không trùng trong javascript

const ArrayRandomModule = {
  // get random item from array
  random: function (array) {
    return array[Math.random() * array.length | 0];
  },

  // [mutate]: extract from given array a random item
  pick: function (array, i) {
    return array.splice(i >= 0 ? i : Math.random() * array.length | 0, 1)[0];
  },

  // [mutate]: shuffle the given array
  shuffle: function (array) {
    for (var i = array.length; i > 0; --i)
      array.push(array.splice(Math.random() * i | 0, 1)[0]);
    return array;
  }
}

2 hữu ích 2 bình luận chia sẻ

Random không trùng trong javascript

Đăng nhập để trả lời câu hỏi

Có thể bạn quan tâm

Random không trùng trong javascript