>  기사  >  웹 프론트엔드  >  반복 없이 배열 항목을 무작위로 효율적으로 선택하는 방법은 무엇입니까?

반복 없이 배열 항목을 무작위로 효율적으로 선택하는 방법은 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-10-31 03:54:01771검색

How to Efficiently Select Array Items Randomly Without Repetition?

반복 없이 효율적으로 배열 항목을 무작위로 선택

배열에서 항목을 무작위로 선택하여 최근 선택한 항목이 반복되지 않도록 하는 기능을 고안했습니다. 현재 솔루션은 효과적으로 작동하지만 효율성과 과도한 루프로 이어질 수 있는지 여부에 대한 우려가 있습니다. 보다 효율적인 접근 방식을 모색해 보겠습니다.

1. 재귀 고려 사항

예, chooseName() 함수는 고유한 이름을 찾을 때까지 자체 호출하므로 재귀적인 것으로 간주될 수 있습니다. 재귀는 특정 문제에 유용할 수 있지만 스택 사용량과 과도한 깊이 가능성을 염두에 두는 것이 중요합니다.

2. 효율적인 솔루션

효율성 문제를 해결하기 위해 다른 전략을 채택할 수 있습니다. 고유한 이름을 찾을 때까지 재귀 및 반복에 의존하는 대신 원본 배열의 복사본을 만들고 모든 항목이 선택될 때까지 복사본에서 항목을 무작위로 선택할 수 있습니다. 모든 항목이 소진되면 복사본을 원래 상태로 재설정합니다.

다음은 이 접근 방식의 JavaScript 구현입니다.

<code class="javascript">function randomNoRepeats(array) {
  var copy = array.slice(0);
  return function() {
    if (copy.length < 1) { copy = array.slice(0); }
    var index = Math.floor(Math.random() * copy.length);
    var item = copy[index];
    copy.splice(index, 1);
    return item;
  };
}

var chooser = randomNoRepeats(['Foo', 'Bar', 'Gah']);
console.log(chooser()); // => "Bar"
console.log(chooser()); // => "Foo"
console.log(chooser()); // => "Gah"
console.log(chooser()); // => "Foo" -- only repeats once all items are exhausted.</code>

이 접근 방식은 JavaScript의 배열 슬라이스() 메서드를 사용하여 다음을 수행합니다. 원본 배열의 얕은 복사본을 만듭니다. 그런 다음 복사본에서 무작위 항목을 반복적으로 선택하고 복사본에서 제거하여 모든 항목이 소진될 때까지 반복 없이 무작위 선택을 효과적으로 모방합니다. 모든 항목을 선택하면 복사본이 재설정되어 무작위 선택을 다시 시작할 수 있습니다.

위 내용은 반복 없이 배열 항목을 무작위로 효율적으로 선택하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.