JavaScript

【JS】JavaScriptで範囲を指定したランダムな数字を出力

こんにちは!今日はJavaScriptのMath.random()を用いた実用的なコードについて紹介します。

結論

●●以上●●以下のランダムな数を出力する関数はこう!

const rand = (from, to) =>
  ~~(from + Math.random() * (to - from + 1))

rand(11, 13) // 11, 12, 13のどれか

数字逆にしてもいいバージョンはこう!

const rand = (from, to) =>
  ~~(Math.min(from, to) + Math.random() * (Math.abs(to - from) + 1))

rand(13, 11) // 11, 12, 13のどれか

Math.random()について

Math.random()は0以上1未満のランダムな数を返します。0は出る。1は出ない。

Math.random()
// 0.7343417844258269

よくやる例

0以上n未満

nかけると0以上n未満になります。よくやるやつ。

Math.random() * 10
// 9.138772947138971

切り捨て

~~ で切り捨て。これ↓だと0から9のどれかが出る。

~~(Math.random() * 10)
// 7

+1

10かけてるのに0から9までなのがミスの元なので1足す。

~~(Math.random() * 11)
// 10

n以上m以下

n以上m以下にするにはn足してからm-n+1をかける。

3以上5以下ならこう。

~~( 3 + Math.random() * 3)
// 3

実用例

関数rand()を作ったわ。

rand(【最小】, 【最大】)みたいな使い方してね。

const rand = (from, to) =>
  ~~(from + Math.random() * (to - from + 1))

rand(11, 13) // 11, 12, 13のどれか

おまけ

数字逆にしてもいいバージョン

rand(【最大】, 【最小】)とかにしてもエラーにならないやつはこう。

const rand = (from, to) =>
  ~~(Math.min(from, to) + Math.random() * (Math.abs(to - from) + 1))

rand(13, 11)

カリー化

こう。

const rand = from => to =>
  ~~(from + Math.random() * (to - from + 1))

rand(11)(13)

カリー化+数字逆ok

const rand = from => to =>
  ~~(Math.min(from, to) + Math.random() * (Math.abs(to - from) + 1))

rand(13)(11)

カリー化+バッククォート

const rand = from => to =>
  ~~((from[0]|0) + Math.random() * ((to[0]|0) - (from[0]|0) + 1))

rand`11``13`

カリー化+バッククォート+数字逆ok

const rand = from => to =>
  ~~(Math.min((from[0]|0), (to[0]|0)) + Math.random() * (Math.abs((to[0]|0) - (from[0]|0)) + 1))

rand`13``11`

引数がオブジェクト

const rand = ({from, to}) =>
  ~~(from + Math.random() * (to - from + 1))

rand({
  from: 11,
  to: 13,
})

引数がオブジェクト+数字逆ok

const rand = ({from, to}) =>
  ~~(Math.min(from, to) + Math.random() * (Math.abs(to - from) + 1))

rand({
  from: 11,
  to: 13,
})

これ無限に書けるわ

結局

最初に書いたやつ使っとこう

おわり!