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().value cuối cùng sẽ đánh giá undefined khi 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 splice 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ì 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 ? 711 hữu ích 5 bình luận 585k xem chia sẻ answer 1582 var item = items[Math.floor(Math.random()*items.length)];
1582 hữu ích 5 bình luận chia sẻ answer 92 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 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 var random = items[Math.floor(Math.random()*items.length)]
37 hữu ích 0 bình luận chia sẻ answer
34 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 Đâ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 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 var rndval=items[Math.floor(Math.random()*items.length)];
11 hữu ích 0 bình luận chia sẻ answer
8 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 // 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 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 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ẻ Đăng nhập để trả lời câu hỏiCó thể bạn quan tâm |