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

JavaScriptで指定範囲内の乱数をn個生成する方法

JavaScriptでは、数値 n と、範囲(最小値・最大値)を表す2つの数値からなる配列を受け取り、その範囲内に収まる n 個のランダムな値を配列として返す関数が必要になる場面があります。

本記事では、Math.random() を活用してこのような関数を実装する方法を、実際のコード例とともにわかりやすく解説します。

実装コード

まずは完成版のコードを見てみましょう。

const num = 10;
const range = [5, 15];

// 指定範囲内の乱数を1つ生成する関数
const randomBetween = (a, b) => {
    return ((Math.random() * (b - a)) + a).toFixed(2);
};

// 指定範囲内の乱数をnum個(重複なし)生成する関数
const randomBetweenRange = (num, range) => {
    const res = [];
    for(let i = 0; i < num; ){
        const random = randomBetween(range[0], range[1]);
        if(!res.includes(random)){
            res.push(random);
            i++;
        };
    };
    return res;
};

console.log(randomBetweenRange(num, range));

コードの仕組み

1. randomBetween 関数

Math.random() は 0 以上 1 未満のランダムな小数を返します。これに対して (b - a) を掛け、最小値 a を加算することで、「a 以上 b 未満」のランダムな小数を得られます。さらに .toFixed(2) を使うことで、小数点以下第2位までの文字列に整形しています。

2. randomBetweenRange 関数

for ループの中で乱数を1つずつ生成し、includes() によって既に配列内に存在するかどうかをチェックします。重複していなければ配列に追加し、カウンタ i を進めます。これにより、重複のない乱数がちょうど num 個集まるまでループが続きます。

出力結果

コンソールへの出力は次のようになります(ランダムのため毎回異なります)。

[
    '13.25', '10.31',
    '11.83', '5.25',
    '6.28', '9.99',
    '6.09', '7.58',
    '12.64', '8.92'
]

これはあくまで出力の一例であり、実行するたびに異なる結果が得られます。すべての値が指定範囲 [5, 15] の間に収まっていることが確認できます。

注意点

この実装では重複を排除しているため、要求した個数 num が範囲内で作り出せるユニークな値の総数を超えると、無限ループに陥る可能性があります。たとえば toFixed(2) による小数点以下2桁の組み合わせには上限があるためです。大量の乱数が必要な場合は、重複チェックを外すか、範囲や桁数の設定を見直すことをおすすめします。

  1. JavaScriptの範囲オーバーフロー・範囲アンダーフロー(rangeOverflow/rangeUnderflow)プロパティの使い方

    rangeOverflow・rangeUnderflowプロパティとはJavaScriptでは、フォーム要素の validity プロパティ(ValidityStateオブジェクト)を利用することで、ユーザーが入力した値が条件を満たしているかどうかを簡単に検証できます。この中には、数値の入力範囲をチェックするための「rangeOverflow」と「rangeUnderflow」という2つのプロパティが用意されています。Range Underflow(範囲アンダーフロー)入力要素の値が、min属性で指定された最小値よりも小さい場合、validity.rangeUnderflow は true を

  2. JavaScriptで平方根を整数または範囲として取得する方法

    課題 JavaScriptで関数を作成し、整数 n を引数として受け取り、次のいずれかを返す必要があります。 n が平方数(完全平方数)である場合:k * k == n を満たす整数 k をそのまま返す n が平方数でない場合:k * k < n < (k+1) * (k+1) を満たす連続する整数の範囲 (k, k+1) を返す コード例 以下がその実装です。 const num = 83; const squareRootRange = (num = 1) => {     const exact = Math.sqrt(num