답변:
간단한 원 라이너
const randomElement = array[Math.floor(Math.random() * array.length)];
예
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]
되는 약간 빠른
var rand = myArray[Math.random() * myArray.length | 0]
이미 밑줄 이나 lodash가 프로젝트에 포함되어 있다면를 사용할 수 있습니다 _.sample
.
// will return one item randomly from the array
_.sample(['January', 'February', 'March']);
하나 이상의 항목을 무작위로 가져와야하는 경우 밑줄에서 두 번째 인수로 해당 항목을 전달할 수 있습니다.
// will return two items randomly from the array using underscore
_.sample(['January', 'February', 'March'], 2);
또는 _.sampleSize
lodash 에서 메소드를 사용하십시오 .
// will return two items randomly from the array using lodash
_.sampleSize(['January', 'February', 'March'], 2);
임의의 값을 많이 얻으려는 경우 함수를 정의 할 수 있습니다.
먼저 이것을 코드 어딘가에 넣으십시오.
Array.prototype.sample = function(){
return this[Math.floor(Math.random()*this.length)];
}
지금:
[1,2,3,4].sample() //=> a random element
CC0 1.0 라이센스 조건에 따라 퍼블릭 도메인으로 공개 된 코드 .
.sample()
이 임의의 항목을 얻기 위해 어떤 배열 을 호출 할 수 있습니다
~~
보다 훨씬 빠르 Math.Floor()
므로 UI 요소를 사용하여 출력을 생성하는 동안 성능 최적화와 관련 ~~
하여 게임 에서 승리합니다. 더 많은 정보
var rand = myArray[~~(Math.random() * myArray.length)];
그러나 Math.Floor()
비트 연산자가 큰 숫자로 이상하게 작동 하기 때문에 배열에 수백만 개의 요소가 있음을 알고 있다면 Bitwise Operator와 사이를 다시 생각할 수 있습니다. 출력과 함께 설명 된 아래 예를 참조하십시오. 더 많은 정보
var number = Math.floor(14444323231.2); // => 14444323231
var number = 14444323231.2 | 0; // => 1559421343
Math.floor
: 지금
마지막 시간과 다른 무작위 항목을 선택한다고 가정하십시오 (실제로 무작위는 아니지만 여전히 일반적인 요구 사항) ...
@Markus의 답변을 바탕으로 다른 프로토 타입 함수를 추가 할 수 있습니다.
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];
}
}
그리고 다음과 같이 구현하십시오.
var myRandomDiffElement = myArray.randomDiffElement(lastRandomElement)
월 이름 목록과 같은 고정 값이 있고 한 줄 솔루션을 원할 경우
var result = ['January', 'February', 'March'][Math.floor(Math.random() * 3)]
배열의 두 번째 부분은 JavaScript에서 [5,6,8,7] [1,2] = 8 인 이유에 설명 된 액세스 작업입니다 .
가장 짧은 버전 :
var myArray = ['January', 'February', 'March'];
var rand = myArray[(Math.random() * myArray.length) | 0]
| 0
합니까?
| 0
자체는 아무것도하지 않는 비트 단위 연산이지만, 자바 스크립트에서는 float 연산이 비트 단위 연산 전에 int로 변환됩니다 . 그래서 그것은 + ''
실제로 아무것도하지 않는 방법과 비슷 하지만 물건을 문자열로 변환하는 데 사용될 수 있습니다.
Math.floor
않지만 여기에서 올바른 일입니다. 연산자이므로 Math.floor
일부 코드를 실행하는 동안 언제든지 Math.floor = someOtherFunction
'|'에 대해 동일한 작업을 수행 할 수 없기 때문에 보다 빠릅니다 . 의 경우와 다른 한편 Math.floor
과 |
다른 시도되는 Math.floor(-1.5)
대 -1.5 | 0
. 그건 그렇고 괄호가 필요하지 않습니다. |
우선 순위가 매우 낮습니다.
Pascual의 솔루션과 같이 한 줄에 작성하려면 ES6의 찾기 기능을 사용하여 작성하십시오 (사실, n
항목 중 하나를 임의로 선택할 확률 은 1/n
).
var item = ['A', 'B', 'C', 'D'].find((_, i, ar) => Math.random() < 1 / (ar.length - i));
console.log(item);
테스트 목적으로 그리고 별도의 변수에만 배열을 저장하지 않는 적절한 이유가있는 경우이 방법을 사용하십시오. 그렇지 않으면 다른 답변 ( floor(random()*length
및 별도의 기능 사용)을 사용하는 것이 좋습니다.
Faker.js 에는 무작위 테스트 데이터를 생성하기위한 많은 유틸리티 기능이 있습니다. 테스트 스위트와 관련하여 좋은 옵션입니다.
const Faker = require('faker');
Faker.random.arrayElement(['January', 'February', 'March']);
주석 작성자가 언급했듯이 일반적으로 프로덕션 라이브러리에서는이 라이브러리를 사용하지 않아야합니다.
Faker
임의의 배열 요소를 선택하는 실제 방법을 권장 할 수 있습니다 .
배열 프로토 타입 편집은 해로울 수 있습니다. 다음은 작업을 수행하는 간단한 기능입니다.
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
}
용법:
// Example 1
var item = getArrayRandomElement(['January', 'February', 'March']);
// Example 2
var myArray = ['January', 'February', 'March'];
var item = getArrayRandomElement(myArray);
임의의 수의 항목을 리턴 할 수있는 재귀 독립형 함수 ( 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])
}
얻으려면 암호 강력한 임의 항목 형태로 배열 사용
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) )
간단한 기능 :
var myArray = ['January', 'February', 'March'];
function random(array) {
return array[Math.floor(Math.random() * array.length)]
}
random(myArray);
또는
var myArray = ['January', 'February', 'March'];
function random() {
return myArray[Math.floor(Math.random() * myArray.length)]
}
random();
또는
var myArray = ['January', 'February', 'March'];
function random() {
return myArray[Math.floor(Math.random() * myArray.length)]
}
random();
내 생각에, prototype을 엉망으로 만들거나 제 시간에 선언하는 것보다 창에 노출시키는 것을 선호합니다.
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)];
}
이제 앱 어디에서나 다음과 같이 호출합니다.
var rand = window.choice.call(array)
이렇게하면 여전히 for(x in array)
루프를 올바르게 사용할 수 있습니다
for...in
배열이나 일반적으로 사용해서는 안됩니다 . 프로토 타입 체인을 걸을 위험이 있습니다. 또한 배열의 모든 인덱스가 아니라 객체의 모든 속성을 의미합니다. 배열에서 반복자를 사용하려면을 사용하십시오 for (var i = 0; i < foo.length; i++){}
. 더 좋은 방법은 Array.prototype.forEach
대신 비슷한 것을 사용하십시오.
변수 rand를 다른 변수에 연결하여 myArray [];의 호출 안에 해당 숫자를 표시 할 수 있도록하여 최상위 답변의 복잡성을 피할 수있는 방법을 찾았습니다. 생성 된 새로운 배열을 삭제하고 합병증을 극복함으로써 효과적인 해결책을 찾았습니다.
<!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
지금 여기에 변화 ... random
... 자체는 변경되지 않으며, 아무것도 두 번 이상 호출되지지고
임의의 요소를 얻는 일반적인 방법 :
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 는 이것을 좀 더 단순하고 읽기 쉽게 만듭니다.
console.log( rando(['January', 'February', 'March']).value );
<script src="https://randojs.com/1.0.0.js"></script>
방법은 다음과 같습니다.
$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)];
하나의 임의의 값을 만들고 배열로 전달
다음 코드를 시도하십시오 ..
//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(...))
반올림 되는 호출에 유의하십시오 .