js-Math.random()

前言

js中有俩个全局对象,一个是Global,一个是Math。
Math中提供了一下数学中常用的函数。比如:

Math.random()

MDN 上面解释到:

Math.random()函数返回一个浮点伪随机数,范围从0到1但不包括1 - 然后您可以缩放到您想要的范围。该实现选择初始种子给随机数生成算法;
这里我想强调的是Math.random()返回的是浮点数取不到1

例子

Math.random()*100;//[0,100]之间的数,但是取不到一百。
parseInt(Math.random()*101);//[0,100]之间整数

lodash中的rendom()

_.random([lower=0], [upper=1], [floating])

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Arguments   
[lower=0] (number): The lower bound.
[upper=1] (number): The upper bound.
[floating] (boolean): Specify returning a floating-point number.


Example:

_.random(0, 5);
// => an integer between 0 and 5

_.random(5);
// => also an integer between 0 and 5

_.random(5, true);
// => a floating-point number between 0 and 5

_.random(1.2, 5.2);
// => a floating-point number between 1.2 and 5.2

源码解析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
function random(lower, upper, floating) {
if (floating === undefined) {//判断floating参数
if (typeof upper == 'boolean') {
floating = upper
upper = undefined
}
else if (typeof lower == 'boolean') {
floating = lower
lower = undefined
}
}
if (lower === undefined && upper === undefined) {//默认取0-1
lower = 0
upper = 1
}
else {//传一个数字参数
lower = toFinite(lower)
if (upper === undefined) {
upper = lower
lower = 0
} else {
upper = toFinite(upper)
}
}
if (lower > upper) {//处理大小传错了的话,更换一下
const temp = lower
lower = upper
upper = temp
}
if (floating || lower % 1 || upper % 1) {//如果返回的是浮点数
const rand = Math.random()//随机种子
const randLength = `${rand}`.length - 1 //种子的长度
return Math.min(lower + (rand * (upper - lower + freeParseFloat(`1e-${randLength}`)), upper))
}
return lower + Math.floor(Math.random() * (upper - lower + 1))//默认返回整数的随机数
}

return lower + Math.floor(Math.random() * (upper - lower + 1))//默认返回整数的随机数
这里是比较重点的。巧妙用了取整的Math.floor()的方法。

结束

lodash是个好用的函数库。