指定した範囲内の数値をランダムに並べ替える、みたいな処理をしたいという要望がたまにあるので、個人的によくやる方法をメモしておきます。
サンプルコード
JavaScript
function rangeRandom(min, max) {
// 範囲の最小値
var rangeMin = min;
// 範囲の最大値
var rangeMax = max;
// 範囲内の数値の個数
var rangeLength = rangeMax - rangeMin + 1;
// 並び替え前の数値を管理する配列
var countArr = [];
// 並び替え後の数値を格納する配列
var randomArr = [];
// 範囲内の数値をcountArrに格納
for(var i = 0; i < rangeLength; i++) {
countArr[i] = i + rangeMin;
}
for(var i = 0; i < rangeLength; i++) {
// 0~countArrの個数 の範囲から、数値をランダムに抽出
var randomTarget = Math.floor(Math.random() * countArr.length);
// randomArrに数値を格納(randomTargetの数値を格納するのではなく、countArrのrandomTarget番目の配列の数値を格納)
randomArr[i] = countArr[randomTarget];
// 同じ数値を再度使わないように、今回使った数値をcountArrから削除しておく。
countArr.splice(randomTarget, 1);
}
return randomArr;
}
// テスト
console.log('min:0 max:5 の場合 ' + rangeRandom(0, 5));
console.log('min:4 max:8 の場合 ' + rangeRandom(4, 8));
console.log('min:-3 max:4 の場合 ' + rangeRandom(-3, 4));
console.log('min:-12 max:-4 の場合 ' + rangeRandom(-12, -4));
指定範囲内の数値をランダムに並べ替えるデモページ
コンソールに指定範囲とその結果を表示するようにしています。
実装内容はコード内に記載しているコメントの通りです。
コメントが承認されるまで時間がかかります。