关于 Math.random()要写一个总结

Math.random() 返回0(含)到1(不含)之间的伪随机数.

注意到是0到1之间的数据,另外它并不是真的随机数,很少会去关注她是随机,然而,这次面试官就问了。
伪随机,也就是在若干次随机后,还可能重复出现这个数,也就是说不是真的随机数咯。
那么问题来了,到底什么是「真随机」?计算机能不能产生「真正的真随机」?

回忆大学里学过的概率论,真正的随机数其实是物理现象产生的,如抛硬币,量子力学效应等。
而计算机产生随机的方法(人为的思维)主要有 :
①.线性同余;
②.平方取中;
③.M-sequence;
④.梅森旋转。
这些算法产生的都是随机数。

实际上不必去关心这个问题了,也许像密码学可能会有所应用,在软件开发中「真伪随机」并实际无影响。
重点在下面,有时候向服务端实时请求数据,会在URL后面加上随机字符,解决浏览器缓存问题。
可以在URL后面加上伪随机数或者时间戳,也许时间戳更加严谨,但并无大碍。

//截取项目中的jsonp跨域片段
function requestData(auth) {
var script = document.createElement('script'),
eleHeadOne = document.getElementsByTagName("head")[0],
serverUrl = 'http://m.jd.com/activity/1023412',
entranceId = '20160415170000001',
callbackFun = 'GuideNewUserActivity';
script.src = serverUrl + '?callback=' + callbackFun + '&auth=' + auth + '&entranceId=' + entranceId + '&t=' + Math.random();
eleHeadOne.appendChild(script);
};

另外如果我们要[1,10]范围随机整数,该如何处理?
打开Terminal,进入Node模式,我们先来生成[1,10]范围的随机浮点数:

> Math.random()*(10-1)+1
7.819066008087248

然后来说说3个Math的内置函数:

> Math.round(7.819066008087248)
8
> Math.ceil(7.819066008087248)
8
> Math.floor(7.819066008087248)
7

不慌,咱们换个数据,7.819066008087248 –> 7.419066008087248(小数点后一位改成了4)

> Math.round(7.419066008087248)
7
> Math.ceil(7.419066008087248)
8
> Math.floor(7.419066008087248)
7

看到只有Math.round结果变了,因为Math.round遵循四舍五入,而Math.ceil始终上进一位Math.floor始终舍去一位

更多好玩的看这篇文章link


附 时间戳

获取时间戳的方法:

var xDate = new Date(),
time1 = xDate.getTime(),//从1970年1月1日午夜开始的毫秒数,时间戳会精确到毫秒
time2 = xDate.valueOf(),//同上,时间戳会精确到毫秒
time3 = Date.parse(date);//只能精确到秒,毫秒将用0来代替

将时间戳转换成日期格式:

// 简单的一句代码
var date = new Date(时间戳); //获取一个时间对象 注意:如果是uinx时间戳记得乘于1000。比如php函数time()获得的时间戳就要乘于1000

/**
1. 下面是获取时间日期的方法,需要什么样的格式自己拼接起来就好了
2. 更多好用的方法可以在这查到 -> http://www.w3school.com.cn/jsref/jsref_obj_date.asp
*/
date.getFullYear(); // 获取完整的年份(4位,1970)
date.getMonth(); // 获取月份(0-11,0代表1月,用的时候记得加上1)
date.getDate(); // 获取日(1-31)
date.getTime(); // 获取时间(从1970.1.1开始的毫秒数)
date.getHours(); // 获取小时数(0-23)
date.getMinutes(); // 获取分钟数(0-59)
date.getSeconds(); // 获取秒数(0-59)
坚持原创技术分享,您的支持将鼓励我继续创作!