programing

JavaScript 배열에서 임의 값 가져오기

copysource 2022. 10. 31. 23:30
반응형

JavaScript 배열에서 임의 값 가져오기

고려사항:

var myArray = ['January', 'February', 'March'];    

JavaScript를 사용하여 이 어레이에서 랜덤 값을 선택하려면 어떻게 해야 합니까?

간단한 원라이너입니다.

const randomElement = array[Math.floor(Math.random() * array.length)];

예를 들어 다음과 같습니다.

const months = ["January", "February", "March", "April", "May", "June", "July"];

const random = Math.floor(Math.random() * months.length);
console.log(random, months[random]);

프로젝트에 언더스코어 또는 로다시가 이미 포함되어 있는 경우 를 사용할 수 있습니다.

// 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);

또는 lodash의 방법을 사용합니다.

// will return two items randomly from the array using lodash
_.sampleSize(['January', 'February', 'March'], 2);

「」를하는 것을 합니다.[].sample()랜덤 요소를 반환합니다.

먼저, 프로토타입 함수를 정의하려면 다음 스니펫을 코드에 넣습니다.

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

하려면 , 「」를 ..sample():

[1,2,3,4].sample() //=> a random element

이 코드 스니펫을 CC0 1.0 라이선스의 조건에 따라 퍼블릭도메인에 공개합니다.

~~가 훨씬 빠르다Math.Floor()UI 요소를 UI는 다음과 같습니다.~~게임에서 이깁니다.상세 정보

var rand = myArray[~~(Math.random() * myArray.length)];

가 있을 와 Bitwise Operator 중 할 수 .Math.Floor()비트 연산자가 큰 숫자에 대해 이상하게 동작하기 때문입니다.출력에 대해서는, 다음의 예를 참조해 주세요.

var number = Math.floor(14444323231.2); // => 14444323231
var number = 14444323231.2 | 0; // => 1559421343

최단 버전:

var myArray = ['January', 'February', 'March']; 
var rand = myArray[(Math.random() * myArray.length) | 0]
console.log(rand)

지난번과는 다른 랜덤 아이템을 선택한다고 합시다(실제로 랜덤은 아니지만 일반적인 요건입니다).

/**
 * Return a random element from an array that is
 * different than `last` (as long as the array has > 1 items). 
 * Return null if the array is empty.
*/
function getRandomDifferent(arr, last = undefined) {
  if (arr.length === 0) {
    return null;
  } else if (arr.length === 1) {
    return arr[0];
  } else {
    let num = 0;
    do {
      num = Math.floor(Math.random() * arr.length);
    } while (arr[num] === last);
    return arr[num];
  }
}

다음과 같이 구현합니다.

const arr = [1,2,3];
const r1 = getRandomDifferent(arr);
const r2 = getRandomDifferent(arr, r1); // r2 is different than r1.

고정값(예: 월 이름 목록)이 있으며 한 줄의 솔루션을 원하는 경우

var result = ['January', 'February', 'March'][Math.floor(Math.random() * 3)]

어레이의 두 번째 부분은 JavaScript에서 [5,6,8,7][1,2] = 8인 이유에 설명된 액세스 작업입니다.

기능을 이 될 수 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']);

코멘트가 언급한 바와 같이 일반적으로 프로덕션 코드에서 이 라이브러리를 사용하면 안 됩니다.

랜덤 항목을 여러 번 가져와야 하는 경우 함수를 사용합니다. 가지 은 그 을 '다'의 입니다.Array.prototype하지만, 보통은 내장된 프로토타입을 조작했다는 이유로 비난을 받게 됩니다.

그러나 특정 배열 자체에 메서드를 추가할 수 있습니다.

var months = ['January', 'February', 'March'];
months.random = function() {
    return this[Math.floor(Math.random()*this.length)];
};

'우리'를 사용할 수 .months.random()인 것을 하지 않고 원하는 Array.prototype.

랜덤 함수와 마찬가지로 동일한 값을 연속적으로 얻을 위험이 있습니다.이를 원하지 않으면 다른 속성을 사용하여 이전 값을 추적해야 합니다.

months.random=function() {
    var random;
    while((random=this[Math.floor(Math.random()*this.length)]) == this.previous);
    this.previous=random;
    return random;
};

거할 , 거 안 만지작거릴 Array.prototype을 사용하다

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

var data = [ … ];
var moreData = [ … ];

data.random=randomValue;
moreData.random=randomValue;

어레이 프로토타입을 편집하면 해로울 수 있습니다.여기 그 일을 하기 위한 간단한 기능이 있습니다.

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

배열에서 암호로 강력한 임의 항목을 가져오려면 다음과 같이 하십시오.

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) )

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

이것은 @Jacob Relkin의 솔루션과 비슷하지만 보다 일반적인 것입니다.

다음은 ES2015입니다.

const randomChoice = arr => {
    const randIndex = Math.floor(Math.random() * arr.length);
    return arr[randIndex];
};

코드는 0에서 배열 길이 사이의 임의의 숫자를 선택한 다음 해당 인덱스에서 항목을 반환하는 방식으로 작동합니다.

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

또는 동등한 단축 버전:

var item = myArray[(Math.random()*myArray.length)|0];

샘플 코드:

var myArray = ['January', 'February', 'March'];    
var item = myArray[(Math.random()*myArray.length)|0];
console.log('item:', item);

간단한 기능:

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();

제 생각에는 시제품을 만지작거리거나 때마침 선언하는 것보다 창문에 노출시키는 것이 더 낫다고 생각합니다.

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) 순환하다

변수 랜드와 다른 변수를 연결하여 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>

static generateMonth() { 
const theDate = ['January', 'February', 'March']; 
const randomNumber = Math.floor(Math.random()*3);
return theDate[randomNumber];
};

배열에 상수 변수를 설정한 다음 배열의 세 개체 중에서 랜덤하게 선택하는 다른 상수가 있으면 함수는 결과를 반환합니다.

진정한 원라이너를 찾기 위해 이 일을 하게 되었습니다.

['January', 'February', 'March'].reduce((a, c, i, o) => { return o[Math.floor(Math.random() * Math.floor(o.length))]; })

배열 프로토타입에 메서드를 추가하면 랜덤 값을 쉽게 얻을 수 있습니다.

이 예에서는 배열에서 단일 또는 여러 개의 랜덤 값을 가져올 수 있습니다.

스니펫 버튼을 클릭하여 테스트 코드로 이동할 수 있습니다.

Array.prototype.random = function(n){
  if(n&&n>1){
    const a = [];
    for(let i = 0;i<n;i++){
      a.push(this[Math.floor(Math.random()*this.length)]);
    }
    return a;
  } else {
    return this[Math.floor(Math.random()*this.length)];
  }
}

const mySampleArray =  ['a','b','c','d','e','f','g','h'];

mySampleArray.random(); // return any random value etc. 'a', 'b'
mySampleArray.random(3); //retun an array with random values etc: ['b','f','a'] , ['d','b','d']

alert(mySampleArray.random());
alert(mySampleArray.random(3));

방법 1:

  • Math.random() 함수를 사용하여 (0-1, 1 제외) 사이의 난수를 가져옵니다.
  • 어레이 길이에 곱하면 (0-arrayLength) 사이의 숫자가 나옵니다.
  • Math.floor()를 사용하여 (0 ~arrayLength-1) 범위의 인덱스를 가져옵니다.

const ar = ["foo", bar];
const randomyPickedString=arr[Math.floor(Math.random() *ar.length)]; console.log(randomlyPickedString);

방법 2:.

  • random(a, b) 메서드는 (a ~b, b 배타적) 사이의 숫자를 생성하기 위해 사용됩니다.
  • (1 ~ arrayLength) 범위의 수치를 구합니다.
  • 1을 빼서 (0 ~arrayLength-1) 범위의 인덱스를 가져옵니다.

const ar = ["foo", bar];
const randomyPickedString=arr[Math.floor(random(1, 5)-1]; console.log(randomlyPickedString);

제공되는 솔루션의 대부분은 특정 어레이에 메서드를 추가하여 해당 어레이에서만 사용할 수 있으며 TypeScript에서는 사용할 수 없습니다.이 TypeScript 솔루션은 모든 어레이에서 사용할 수 있는 안전한 재사용 코드입니다.

export function randChoice<T>(arr: Array<T>): T {
  return arr[Math.floor(Math.random() * arr.length)]
}

랜덤 요소를 가져오는 일반적인 방법:

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

다음은 그 방법의 예입니다.

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

랜덤 값 1개를 생성하여 어레이에 전달

다음 코드를 사용해 보십시오.

//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);

randojs를 사용하면, 보다 심플하고 읽기 쉽게 할 수 있습니다.

console.log( rando(['January', 'February', 'March']).value );
<script src="https://randojs.com/1.0.0.js"></script>

아무도 네이티브 랜덤 값을 사용하지 않았다니 정말 놀랐습니다.

array[Date.now()%array.length]

1600000000000000보다 긴 어레이에서는 동작하지 않지만, 이러한 어레이는 결코 작성하지 않을 것입니다.

업데이트

질문하는 한에서는 어레이에서 랜덤한 값을 선택하는 방법을 설명합니다.myArray(len=3일 경우) 솔루션은 다음과 같습니다.

myArray[Date.now()%myArray.length]

언급URL : https://stackoverflow.com/questions/4550505/getting-a-random-value-from-a-javascript-array

반응형