Math.randomは+0以上1未満の正の符号を持つ数値を、実装で定義されたアルゴリズムまたは戦略を使用して、その範囲内でほぼ一様に分布するようにランダムまたは疑似ランダムに選択して返します。この関数は引数を取りませんhttps://tc39.es/ecma262/#sec-math.random ECMA-262::21.3.2.27 Math.random ( )。
構文:
const randomNumber = Math.random();
解説:| 0（ゼロとの論理和）と組み合わせて使用することにより、整数の擬似乱数を取得することができます。
[https://paiza.io/projects/e9Dfoq0vOguJmE1JA2vl5g?language=javascript 0以上10未満のランダムな整数を表示]:
for (let i = 0; i < 5; i++) {
  let randomNumber = (Math.random() * 10) | 0
  console.log(randomNumber)
}
[https://paiza.io/projects/dp-w6pOF8QHv9y6zgSY3Sw?language=python3 5以上10未満のランダムな整数を表示]:
for (let i = 0; i < 5; i++) {
  let randomNumber = (Math.random() * (10 - 5) + 5) | 0;
  console.log(randomNumber);
}
[https://paiza.io/projects/mXo5cpPNlQuRPcWJcfPqkQ?language=javascript 配列からランダムに要素を取出]:
const array = [..."ABCDE"]; // ["A", "B", "C", "D", "E"]
for (let i = 0; i < 5; i++) {
  let index = (Math.random() * array.length) | 0
  console.log( array[index] )
}
JavaScriptの配列はarray[2.3116713552735746]のような浮動小数点数の添え字をarray[2]のような整数の添え字に自動的には変換しないため、必ず上記の例のように| 0を適用して整数の添え字に変換してから渡さなければなりません。
このようにゼロとの論理和は整数化のイディオムです。
これは、ビット演算を行う前にオペランドは32ビット符号付き整数に変換されるJavaScriptの仕様を利用しています。
32ビット符号付き整数は配列の添字の取り得る範囲とも一致しています。
論理演算子は算術演算子より優先度が低いので左の項の括弧は不要ですが、意外性が強いので括弧でくくりました。