Câu trả lời:
Nó là một lót đơn giản
const randomElement = array[Math.floor(Math.random() * array.length)];
Thí dụ
const months = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
const randomMonth = months[Math.floor(Math.random() * months.length)];
console.log("random month =>", randomMonth);
var rand = myArray[Math.random() * myArray.length>>0]
là nhanh hơn một chút
var rand = myArray[Math.random() * myArray.length | 0]
Nếu bạn đã có dấu gạch dưới hoặc ký tự bao gồm trong dự án của bạn, bạn có thể sử dụng _.sample
.
// will return one item randomly from the array
_.sample(['January', 'February', 'March']);
Nếu bạn cần lấy ngẫu nhiên nhiều hơn một mục, bạn có thể chuyển mục đó thành đối số thứ hai trong dấu gạch dưới:
// will return two items randomly from the array using underscore
_.sample(['January', 'February', 'March'], 2);
hoặc sử dụng _.sampleSize
phương thức trong lodash:
// will return two items randomly from the array using lodash
_.sampleSize(['January', 'February', 'March'], 2);
Nếu bạn có kế hoạch nhận được một giá trị ngẫu nhiên rất nhiều, bạn có thể muốn xác định một hàm cho nó.
Đầu tiên, đặt mã này vào mã của bạn ở đâu đó:
Array.prototype.sample = function(){
return this[Math.floor(Math.random()*this.length)];
}
Hiện nay:
[1,2,3,4].sample() //=> a random element
Mã được phát hành vào phạm vi công cộng theo các điều khoản của giấy phép Muff 1.0 .
.sample()
bất kỳ mảng nào để nhận một mục ngẫu nhiên
~~
nhanh hơn nhiều Math.Floor()
, vì vậy khi tối ưu hóa hiệu suất trong khi tạo đầu ra bằng các yếu tố UI, ~~
sẽ thắng trò chơi. THÊM THÔNG TIN
var rand = myArray[~~(Math.random() * myArray.length)];
Nhưng nếu bạn biết rằng mảng sẽ có hàng triệu phần tử hơn bạn có thể muốn xem xét lại giữa Toán tử Bitwise và Math.Floor()
, khi toán tử bitwise hành xử kỳ lạ với số lượng lớn. Xem ví dụ dưới đây giải thích với đầu ra. THÊM THÔNG TIN
var number = Math.floor(14444323231.2); // => 14444323231
var number = 14444323231.2 | 0; // => 1559421343
Math.floor
bây giờ :)
Giả sử bạn muốn chọn một mục ngẫu nhiên khác với lần trước (không thực sự ngẫu nhiên, nhưng vẫn là một yêu cầu chung) ...
Dựa trên câu trả lời của @Markus, chúng ta có thể thêm một hàm nguyên mẫu khác:
Array.prototype.randomDiffElement = function(last) {
if (this.length == 0) {
return;
} else if (this.length == 1) {
return this[0];
} else {
var num = 0;
do {
num = Math.floor(Math.random() * this.length);
} while (this[num] == last);
return this[num];
}
}
Và thực hiện như vậy:
var myRandomDiffElement = myArray.randomDiffElement(lastRandomElement)
Nếu bạn có các giá trị cố định (như danh sách tên tháng) và muốn giải pháp một dòng
var result = ['January', 'February', 'March'][Math.floor(Math.random() * 3)]
Phần thứ hai của mảng là một hoạt động truy cập như được mô tả trong Tại sao [5,6,8,7] [1,2] = 8 trong JavaScript?
Phiên bản ngắn nhất:
var myArray = ['January', 'February', 'March'];
var rand = myArray[(Math.random() * myArray.length) | 0]
| 0
làm gì?
| 0
Bản thân @KenSharp là một hoạt động bitwise không có gì, nhưng trong các javascript float được chuyển đổi thành ints trước bất kỳ hoạt động bitwise nào . Vì vậy, nó giống như cách + ''
không thực sự làm bất cứ điều gì nhưng có thể được sử dụng để chuyển đổi mọi thứ thành chuỗi.
Math.floor
nhưng đó là điều chính xác để làm ở đây. Đó là một toán tử vì vậy nó nhanh hơn Math.floor
nếu chỉ bởi vì bất cứ lúc nào trong khi chạy một số mã có thể làm Math.floor = someOtherFunction
và họ không thể làm tương tự cho '|'. Mặt khác khi cho Math.floor
và |
là khác nhau thử Math.floor(-1.5)
vs -1.5 | 0
. Bằng cách này, bạn không cần dấu ngoặc đơn. |
có một ưu tiên rất thấp.
Nếu bạn muốn viết nó trên một dòng, như giải pháp của Pascual, một giải pháp khác là viết nó bằng chức năng tìm của ES6 (dựa trên thực tế, xác suất chọn ngẫu nhiên một trong số n
các mục là 1/n
):
var item = ['A', 'B', 'C', 'D'].find((_, i, ar) => Math.random() < 1 / (ar.length - i));
console.log(item);
Sử dụng phương pháp đó cho mục đích thử nghiệm và nếu có lý do chính đáng để không chỉ lưu mảng trong một biến riêng biệt. Nếu không, các câu trả lời khác ( floor(random()*length
và sử dụng chức năng riêng biệt) là cách của bạn để đi.
Faker.js có nhiều hàm tiện ích để tạo dữ liệu thử nghiệm ngẫu nhiên. Đây là một lựa chọn tốt trong ngữ cảnh của bộ thử nghiệm:
const Faker = require('faker');
Faker.random.arrayElement(['January', 'February', 'March']);
Như các nhà bình luận đã đề cập, bạn thường không nên sử dụng thư viện này trong mã sản xuất.
Faker
đó chọn một phần tử mảng ngẫu nhiên.
Chỉnh sửa nguyên mẫu Array có thể gây hại. Đây là một chức năng đơn giản để thực hiện công việc.
function getArrayRandomElement (arr) {
if (arr && arr.length) {
return arr[Math.floor(Math.random() * arr.length)];
}
// The undefined will be returned if the empty array was passed
}
Sử dụng:
// Example 1
var item = getArrayRandomElement(['January', 'February', 'March']);
// Example 2
var myArray = ['January', 'February', 'March'];
var item = getArrayRandomElement(myArray);
Hàm đệ quy, độc lập có thể trả về bất kỳ số lượng mục nào (giống hệt với lodash.sampleSize ):
function getRandomElementsFromArray(array, numberOfRandomElementsToExtract = 1) {
const elements = [];
function getRandomElement(arr) {
if (elements.length < numberOfRandomElementsToExtract) {
const index = Math.floor(Math.random() * arr.length)
const element = arr.splice(index, 1)[0];
elements.push(element)
return getRandomElement(arr)
} else {
return elements
}
}
return getRandomElement([...array])
}
Để có được mảng mẫu vật phẩm ngẫu nhiên mạnh về tiền điện tử, hãy sử dụng
let rndItem = a=> a[rnd()*a.length|0];
let rnd = ()=> crypto.getRandomValues(new Uint32Array(1))[0]/2**32;
var myArray = ['January', 'February', 'March'];
console.log( rndItem(myArray) )
Điều này tương tự, nhưng tổng quát hơn, giải pháp của @Jacob Relkin:
Đây là ES2015:
const randomChoice = arr => {
const randIndex = Math.floor(Math.random() * arr.length);
return arr[randIndex];
};
Mã này hoạt động bằng cách chọn một số ngẫu nhiên trong khoảng từ 0 đến độ dài của mảng, sau đó trả về mục tại chỉ mục đó.
var item = myArray[Math.floor(Math.random()*myArray.length)];
hoặc phiên bản ngắn hơn tương đương:
var item = myArray[(Math.random()*myArray.length)|0];
Mã mẫu:
var myArray = ['January', 'February', 'March'];
var item = myArray[(Math.random()*myArray.length)|0];
console.log('item:', item);
Chức năng đơn giản:
var myArray = ['January', 'February', 'March'];
function random(array) {
return array[Math.floor(Math.random() * array.length)]
}
random(myArray);
HOẶC LÀ
var myArray = ['January', 'February', 'March'];
function random() {
return myArray[Math.floor(Math.random() * myArray.length)]
}
random();
HOẶC LÀ
var myArray = ['January', 'February', 'March'];
function random() {
return myArray[Math.floor(Math.random() * myArray.length)]
}
random();
Theo tôi, tốt hơn là loay hoay với các nguyên mẫu, hoặc khai báo nó đúng lúc, tôi thích phơi nó ra cửa sổ:
window.choice = function() {
if (!this.length || this.length == 0) return;
if (this.length == 1) return this[0];
return this[Math.floor(Math.random()*this.length)];
}
Bây giờ bất cứ nơi nào trên ứng dụng của bạn, bạn gọi nó như:
var rand = window.choice.call(array)
Bằng cách này, bạn vẫn có thể sử dụng for(x in array)
vòng lặp đúng cách
for...in
trên mảng, hoặc thậm chí nói chung. Bạn có nguy cơ đi bộ chuỗi nguyên mẫu. Nó cũng có nghĩa cho tất cả các thuộc tính của một đối tượng, không phải tất cả các chỉ mục trong một mảng. Nếu bạn muốn sử dụng một trình vòng lặp trên một mảng, hãy sử dụng for (var i = 0; i < foo.length; i++){}
. Thậm chí tốt hơn, sử dụng một cái gì đó như Array.prototype.forEach
thay thế.
Tôi đã tìm thấy một cách xoay quanh các biến chứng của câu trả lời hàng đầu, chỉ bằng cách ghép rand biến với một biến khác cho phép số đó được hiển thị bên trong cách gọi của myArray [];. Bằng cách xóa mảng mới được tạo và đùa giỡn với các biến chứng của nó, tôi đã đưa ra một giải pháp hiệu quả:
<!DOCTYPE html>
<html>
<body>
<p id="demo"></p>
<script>
var myArray = ['January', 'February', 'March', 'April', 'May'];
var rand = Math.floor(Math.random() * myArray.length);
var concat = myArray[rand];
function random() {
document.getElementById("demo").innerHTML = (concat);
}
</script>
<button onClick="random();">
Working Random Array generator
</button>
</body>
</html>
concat
thay đổi ở đây ... random
bản thân nó không thay đổi và không có gì khác được gọi nhiều hơn một lần ....
static generateMonth() {
const theDate = ['January', 'February', 'March'];
const randomNumber = Math.floor(Math.random()*3);
return theDate[randomNumber];
};
Bạn đặt một biến hằng cho mảng, sau đó bạn có một hằng số khác chọn ngẫu nhiên giữa ba đối tượng trong mảng và sau đó hàm chỉ đơn giản trả về kết quả.
Một cách chung để lấy (các) phần tử ngẫu nhiên:
let some_array = ['Jan', 'Feb', 'Mar', 'Apr', 'May'];
let months = random_elems(some_array, 3);
console.log(months);
function random_elems(arr, count) {
let len = arr.length;
let lookup = {};
let tmp = [];
if (count > len)
count = len;
for (let i = 0; i < count; i++) {
let index;
do {
index = ~~(Math.random() * len);
} while (index in lookup);
lookup[index] = null;
tmp.push(arr[index]);
}
return tmp;
}
randojs làm cho điều này đơn giản hơn một chút và dễ đọc hơn:
console.log( rando(['January', 'February', 'March']).value );
<script src="https://randojs.com/1.0.0.js"></script>
Đây là một ví dụ về cách làm điều đó:
$scope.ctx.skills = data.result.skills;
$scope.praiseTextArray = [
"Hooray",
"You\'re ready to move to a new skill",
"Yahoo! You completed a problem",
"You\'re doing great",
"You succeeded",
"That was a brave effort trying new problems",
"Your brain was working hard",
"All your hard work is paying off",
"Very nice job!, Let\'s see what you can do next",
"Well done",
"That was excellent work",
"Awesome job",
"You must feel good about doing such a great job",
"Right on",
"Great thinking",
"Wonderful work",
"You were right on top of that one",
"Beautiful job",
"Way to go",
"Sensational effort"
];
$scope.praiseTextWord = $scope.praiseTextArray[Math.floor(Math.random()*$scope.praiseTextArray.length)];
một phương pháp dễ dàng khác:
var myArray = ['keke','keko','cano','halo','zirto'];
var randomValue = myArray[Math.round((Math.random()*1000))%myArray.length];
Tạo một giá trị ngẫu nhiên và truyền vào mảng
Vui lòng thử mã sau ..
//For Search textbox random value
var myPlaceHolderArray = ['Hotels in New York...', 'Hotels in San Francisco...', 'Hotels Near Disney World...', 'Hotels in Atlanta...'];
var rand = Math.floor(Math.random() * myPlaceHolderArray.length);
var Placeholdervalue = myPlaceHolderArray[rand];
alert(Placeholdervalue);
Math.floor(Math.random(...))
cuộc gọi, làm tròn xuống.