##参考
JavaScriptで重複しない乱数を生成する…関数化されていない重複しない整数乱数の生成方法
##やりたいこと
重複しない整数乱数を配列で生成したい + 関数として利用したい
##やったこと
重複しない整数乱数を生成する関数を参考URLのコードをちょっと改変して作成
##コード
Google Apps Script環境で実装しているためJavaScriptだと修正が必要かも。
###改変前の関数化していないコード
randomizing.js
function randomizing(){
var arr = [];
numArr = [];
for(var i=0; i < 5; i++){
arr[i]=i+1;
}
for(var j = 0,len = arr.length; j < 5; j++, len--) {
rndNum = Math.floor(Math.random()*len);
numArr.push(arr[rndNum]);
arr[rndNum] = arr[len-1];
}
//debug
for(var k=0; k<numArr.length; k++){
console.log(numArr[k])
}
}
実行結果
4
1
2
5
3
###関数化したコード
generateRandomNumArray.js
//test用
function test(){
generateRandomNumArray(30,5);
}
//重複しない1~maxNumの整数乱数を生成する関数
/**
* @param {number} maxNum - 取りうる最大値
* @param {number} generateArrayLength - 生成する配列の長さ
* @return {number[]}
*/
function generateRandomNumArray(maxNum, generateArrayLength){
let generateArray = []; //ランダム格納用配列
let numberArray = []; //ランダム生成用配列
//ランダム生成用配列を作成
for(let i=0; i<maxNum; i++){
numberArray[i] = i+1;
}
//ランダム格納用配列にランダム整数を格納
for(let j=0,len=numberArray.length; j<generateArrayLength; j++,len--){
let rndNum = Math.floor(Math.random()*len);
generateArray.push(numberArray[rndNum]);
numberArray[rndNum] = numberArray[len-1];
}
//debug
for(let k=0; k<generateArray.length; k++){
console.log(generateArray[k]);
}
return generateArray;
}//end function
実行結果
19
25
17
29
30
##あとがき
GAS+SSでランダムな規定数の行にランダムチェック的なフラグをたてたかったのだが、重複しないような乱数配列生成をしてくれるようなジャストな関数はなかった。
もしかしたらもっと短く済む方法があるかもしれない。
あと正直コードの意味がわからない、コピペでも動いてしまうって怖いね