JavaScriptはランダム整数を取得します.

4123 ワード

Math.random()メソッドは、0(含む)~1(含まない)の間の乱数を返します.
 
0-10の間の数を取得するには、この方法の値*10であるMath.random()*10が必要です.
0-20の間の数を取得するには、同じように、この方法の値*20を取得する必要があります. つまりMath.random()*20;
じゃ、0-nの間の数を取りたいです.nは10倍の数です.つまり、Math.random()**nです.
 
1-11の間の数を取りたいですか?0-10の上に、1を加えます. つまりMath.random()*10+1;
すなわち、m−n+mの間の数を取得するには、nは全体の10倍の数であり、即ち、Math.random()*n+mである.
 
1-10の間の数はどうなりますか?0-9の上に、1を加えます. つまりMath.random()*9+1;
m-nの間の数、すなわちMath.random()*(n-m)+mを取得したいです.
 
この場合、取得した数値はすべて小数であり、しかもmよりn未満の値である.
小数点以下の数値を切り捨てる方法はいろいろあります.パースInt()、Math.ceir()、Math.flor()、Math.round()などです.
parseInt()またはMath.flor()を使用すると、0-1の間では永遠に1を取れない場合は、満たされない.
Math.ceir()を使用すると、0-1の間で、取得した値が0でない限り、1を取得した場合、満足していますが、確率は平均していません.
Math.round()を使うのが最適で、0-1の間では0.5以上の値は1を返し、0.5以下の値は0を返します.確率平均
 
したがって、m-nの間の数を取得すると、mはnに等しくなく、Math.round(Math.random()*(n-m)+m)
 
重複しないランダム整数を取得します.(パラメータ:乱数個数、最小値、最大値)
function randomArr(params) {
  params = { ...{ length: 5, min: 2, max: 32 }, ...params };
  let { length, min, max } = params;
  if (
    typeof length != "number" ||
    typeof min != "number" ||
    typeof max != "number" ||
    max <= min ||
    length <= 0
  ) {
    return [];
  }
  if(max - min < length) {
    length = max - min + 1;
  }
  let arr = [];
  for (let i = 0; i < length; i++) {
    let num = Math.round(Math.random() * (max - min)) + min;
    if (!arr.includes(num)) {
      arr.push(num);
    } else {
      i-=1
    }
  }
  return arr;
}
var result0 = randomArr();
console.log(result0); // [ 7, 15, 18, 16, 4 ]
var result1 = randomArr({});
console.log(result1); // [ 17, 24, 27, 25, 8 ]
var result2 = randomArr({ length: 3 });
console.log(result2); // [ 24, 4, 27 ]
var result3 = randomArr({ min: 0 });
console.log(result3); // [ 21, 11, 8, 18, 13 ]
var result4 = randomArr({ max: 20 });
console.log(result4); // [3, 7, 11, 15, 8]
var result5 = randomArr({ max: 4 });
console.log(result5); // [3, 4, 2]