web関連

【javascript】配列の値が被らない、指定した数値の範囲が被らない数値を出力

2020/05/18

配列の中の数字に被らないのと、その配列の数値±15範囲で数値が被らないようにしたかったときの備忘録

やりたいこと

[1, 30 , 60 , 90]の配列から
・数値が被らない
・±15したときの範囲が被らない
数値を出力したい

要するに4575の数値を出力させる式を作りたい

コード

<script>
var getRandomInt = function(min, max) {// 引数で渡した範囲内のランダムな整数を生成するための関数
  return Math.floor(Math.random() * (max - min + 1)) + min;
};
var max_num = 100;//ランダムで生成する最大値
var array = [1, 30 , 60 , 90];
var random = 10;//初期数値
var num = 15;//範囲数値

while(true){//無限ループ
  for(i = 0; i <= array.length-1; i++){
    //①…ここから
    console.log('【'+array[i]+'】のループ');
    var min = array[i]-num;//範囲の最小値
    var max = array[i]+num;//範囲の最大値
    if(Math.sign(min) == -1){//minが負の数になったときに最小値をに戻す(負の数だと無限ループ入っちゃう)
      min = 0;
    }
    //①…ここまで
    while((random > min && random < max) || array.includes(random) || random == 0){//左から:random数値が最小and最大の範囲外かどうか検証 or random数値が配列の数値と被らないか検証 or random数値が0じゃないかどうか検証

      //以下より上記条件に一つでも一致したらループ
      random = getRandomInt(0, max_num);//再度数値をリセット
      i=0;//変数をリセットして配列の一番最初から再スタート

      //②…ここから
      min = array[i]-num;
      max = array[i]+num;
      if(Math.sign(min) == -1){
        min = 0;
      }
      //②…ここまで
    }
  }
  if(i == array.length){//最後のループになったらwhileループを抜けるための条件式
    alert('配列と数値、範囲が被らない数値は【 '+random+' 】です');
    break;
  }
}
</script>

①…
一番最初の1回目と配列の2番目以降しかループが回ってこない
つまりrandomの数値がリセットされた時、配列の1番最初に戻ったときこの箇所はスルーされてしまうので
変数とかをrandomがリセットされたときに一緒に宣言しないと駄目

②…
①に書いてあることと一緒で、一番最初のループは①を通らないのでここで変数を代入してる

【この備忘録を書く理由】
javascriptでランダム配置したとき、配置したものが被ったり偏ったりするので
配置したものから一定の範囲離したところに配置できるような条件式を作るための練習
 

【感想】
まじで、大変だった
whileってtrueの間だけループして、falseになったらループ抜けるのが中々理解できなかった
初めて1からjavascript書いたけどコピペばっかだと駄目だね