JavaScript
 Computer >> コンピューター >  >> プログラミング >> JavaScript

JavaScriptで特定の値を除外したランダム数値配列を生成する方法

本記事では、2つの引数を受け取る関数を作成します。1つ目の引数は返却する配列の長さ(整数)、2つ目の引数は返却される配列に含めてはいけない要素の配列です。

具体的には、0〜100の範囲でランダムな数値の配列を生成しつつ、引数として渡された配列に含まれる値はすべて除外する必要があります。

注意: 生成される配列内に重複した数値が存在してはいけません。

実装の考え方

ここでは、generateRandom()という関数を定義します。処理の流れは以下のとおりです。

  • Math.random()を使って0〜99のランダムな整数を生成する
  • 生成した数値が除外リスト(absentArray)に含まれていないか確認する
  • すでに結果用の配列に存在していないかも確認し、重複を防ぐ
  • 両方の条件を満たした場合のみ、配列に追加してカウンターを進める

サンプルコード

const absentArray = [44, 65, 5, 34, 87, 42, 8, 76, 21, 33];
const len = 10;
const generateRandom = (len, absentArray) => {
    const randomArray = [];
    for(let i = 0; i < len; ){
        const random = Math.floor(Math.random() * 100);
        if(!absentArray.includes(random) &&
            !randomArray.includes(random)){
            randomArray.push(random);
            i++;
        }
    };
    return randomArray;
}
console.log(generateRandom(len, absentArray));

コードの解説

  • Math.random() * 100で0以上100未満の浮動小数点数を生成し、Math.floor()で整数に丸めています。そのため生成されるのは0〜99の整数です。
  • includes()メソッドにより、除外対象の配列と結果用の配列の両方に同じ値が存在しないことをチェックしています。
  • i++は条件を満たしたときのみ実行されるため、除外値や重複に該当した場合はカウントが進みません。これにより、必要な個数が揃うまでループが継続されます。

出力結果

コンソールには次のような配列が出力されます。(ランダム生成のため、実行するたびに結果は変わります)

[
    23, 93, 29, 25, 37,
    63, 54, 11, 69, 79
]

補足: パフォーマンスを改善するには

上記の方法はシンプルですが、除外する値が多い場合や要求する個数が大きい場合、ループ回数が増えて非効率になる可能性があります。そのようなケースでは、Setオブジェクトを利用して重複チェックを行うと、検索コストを抑えられます。また、除外リスト側もSetに変換しておくことで、includes()よりも高速に判定できます。

  1. 複数の値でJavaScript配列の要素を検索する方法

    JavaScriptである配列(arr)が、別の配列(arr1)の複数の値・すべての要素を含んでいるかどうかを確認したい場面はよくあります。そんなときは、every()メソッドとincludes()メソッドを組み合わせることで、シンプルに判定できます。以下はそのサンプルコードです。 コード例 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content=

  2. JavaScriptの配列を文字列に変換する方法【toString()の使い方を解説】

    JavaScriptで配列の要素をひとつの文字列として扱いたい場面はよくあります。そんなときに便利なのがtoString()メソッドです。このメソッドを使うと、配列の各要素がカンマ(,)で区切られたひとつの文字列に変換されます。以下は、ボタンをクリックすると配列の中身が文字列として画面に表示されるシンプルなサンプルコードです。サンプルコード<!DOCTYPE html> <html lang=ja> <head> <meta charset=UTF-8 /> <meta name=viewport content=width=device-