【JavaScript】0〜9の範囲で重複しない乱数を5つ生成する方法(先頭は0以外)
今回は、ちょうど5つの「重複しない」乱数を格納した配列を生成するJavaScript関数を作成します。満たすべき条件は以下の2つです。
- すべての数値は [0, 9] の範囲内(0以上9以下の整数)であること
- 配列の最初の要素は 0 であってはならないこと
サンプルコード
以下がその実装例です。
const fiveRandoms = () => {
const arr = []
while (arr.length < 5) {
const random = Math.floor(Math.random() * 10);
if (arr.indexOf(random) > -1){
continue;
};
if(!arr.length && !random){
continue;
}
arr[arr.length] = random;
}
return arr;
};
console.log(fiveRandoms());
出力結果
このコードを実行すると、コンソールには次のような出力が表示されます。乱数を使用しているため、実行するたびに結果は変わります。
[ 9, 0, 8, 5, 4 ]
コードの解説
このコードのポイントを順番に見ていきましょう。
- ループで5個まで埋める: 空の配列 arr を用意し、while 文で要素数が5になるまで処理を繰り返します。
- 乱数の生成: Math.floor(Math.random() * 10) によって、0〜9のランダムな整数を1つ生成します。
- 重複の排除: indexOf() で配列内に同じ数値が既に存在するかを確認し、存在する場合は continue でスキップして再抽選します。
- 先頭の0を防止: 配列がまだ空(arr.length === 0)で、かつ生成された数値が 0 の場合もスキップすることで、最初の要素が 0 になることを防いでいます。
- 要素の追加と返却: 条件を通過した数値だけを配列へ追加し、5個揃った時点で配列を返します。
Set を使った別の書き方
重複チェックには Set オブジェクトを使う方法もあります。Set は挿入順序を保持するため、同じ考え方で先頭要素が 0 にならないよう制御できます。
const fiveRandoms = () => {
const set = new Set();
while (set.size < 5) {
const random = Math.floor(Math.random() * 10);
if (!set.size && !random) continue;
set.add(random);
}
return [...set];
};
console.log(fiveRandoms());
どちらの方法でも、0〜9の範囲から重複なく選んだ5個の乱数を、先頭だけは必ず 0 以外にして取得できます。
-
JavaScriptで1からnまでのすべての数で割り切れる最小の数を求める方法
JavaScriptで数値 n を引数として受け取り、1 から n までのすべての整数で余りなく割り切れる最小の数を見つけて返す関数を作成します。この問題は、数学でいう「最小公倍数(LCM)」を 1〜n の範囲で求めることと同じです。 アルゴリズムの考え方 1 から n までの最小公倍数を効率的に求めるには、n 以下の各素数 p に対して「p の累乗のうち n 以下になる最大の値」を求め、それらをすべて掛け合わせます。 例として n = 20 の場合を見てみましょう。20 以下の素数は 2, 3, 5, 7, 11, 13, 17, 19 で、それぞれ使うべき最大の累乗は次のとおりです。
-
JavaScriptで指定範囲内のアームストロング数をすべて求める方法
アームストロング数とはアームストロング数(Armstrong Number)とは、n桁の正の整数において、各桁の数字をn乗した値の総和が元の数と等しくなる数のことです。以下のように定義されます。abcd... = a^n + b^n + c^n + d^n + ...例えば、153は3桁の数であり、1³ + 5³ + 3³ = 1 + 125 + 27 = 153 となるため、アームストロング数に該当します。実装の概要ここでは、範囲の開始値と終了値の2つの数値を含む配列を受け取り、その範囲内に存在するすべてのアームストロング数を配列として返すJavaScript関数を作成します。範囲の端の数が