我们都知道使用Math.random()来得到一个随机数。但是很多人都没有深入的思考过,如何这个随机数是怎么来的。
我也不知道是怎么来的,只知道这是一个比较复杂的随机算法。那么我们有没有可能通过自己的代码来实现一个类似随机数呢?我实践了一下,是可以的。不过我的算法比较简单,所得的随机数不是那么随机。
目标,构建一个0-1之间随机小数
我首先想到的是时间戳。所以,我在chrome控制台输入了
new Date() // return Thu May 04 2017 10:50:04 GMT+0800 (CST) // 不是我想要的,我想要的是时间戳,所以,这样 +new Date() // return 1493866864704 // 这个数字是会变化的,多执行几次 +new Date() 1493866908283 +new Date() 1493866908885 +new Date() 1493866909428 +new Date() 1493866909959 +new Date() 1493866910520 +new Date() 1493866911278如上,多次执行之后,发现,前面基本不变,但是最后几位变化挺大的。原理很简单,后面是毫秒,当然变化快了。
如果倒过来,就应该差不多了,开干
// 先把数字变成字符串 +new Date()+'' // return "1493867038901" // 再把字符串变成数组 (+new Date()+'').split('') // return ["1", "4", "9", "3", "8", "6", "7", "1", "2", "4", "7", "8", "2"] // 再把数组倒排 (+new Date()+'').split('').reverse() // return ["0", "0", "2", "2", "8", "1", "7", "6", "8", "3", "9", "4", "1"] // 再把数组变成字符串 (+new Date()+'').split('').reverse().join('') // return "3274527683941"果然倒过了。
我们需要的是0到1之间的小数,最简单的方法是,在最前面加上'0.',所以,代码是:
'0.'+(+new Date()+'').split('').reverse().join('') // return "0.9282437683941"最后,我们得到的是一个字符串,而我们想要的是一个数字,所以:
+('0.'+(+new Date()+'').split('').reverse().join('')) // return 0.5832047683941好了,我们得到了一个获取随机数的方法了!
不过没什么卵用~,算是练了下脑子吧!