原文地址:http://www.soulteary.com/2014/07/05/js-math-random-trick.html
看到题目,如果大家在平时被问到:
如何生成一个怎么样怎么样的整数随机数,估计大家都会不屑,但是当你淡定的回答:
获取一个范围应该是随机数seeds和区间数值差的乘机与最小数相加然后再怎么怎么的时候…
有没有发现你的思维已经固化了呢。
这个知识点应该是玩JS肯定会碰到的之一吧。
先来掉书袋,看看MDN的文档。
打开Node,进入终端命令行模式,输入Math.random():
Math.random()
0.436846193857491
结果是不是依旧如同往常一样稀松平常的小于1的一个伪随机数跳了出来呢。
这个时候,如果别人问你,还有什么其他方案可以生成随机数么,你会想到神马呢。
如果你继续在终端里输入new Date()-0:
new Date()-0
1404488829907
我想你可以得到一个自增的数字,对,就是“秒”,如果你说这货哪里随机了,请别着急:
(new Date()-0)%10086
8657
这里的取模%的数值可以是大于2且最好小于当前时间的数值,则可以得到你取模数值概率分之一的概率的随机数。
如果你取模的数值是随机数呢,那么产生这个随机数的可见的两个变量都是随机的,那么是不是近似真的“随机数”了呢?
当然,如果使用这招,还要考虑到硬件以及语言执行过程的耗时,因为我们知道计算机执行的时候,有一个时间的精度的范畴,所以需要使用一点点的延时抑制。
扯了一些没用的,你可能着急了,那么请保持好奇心,我们继续说点无聊的事情。
Math.random会提供给我们一个[0,1)之间的随机数,但是如果我们要[1,10]范围随机整数的话,可以使用以下三个函数:
- Math.round
- Math.ceil
- Math.floor
我们先来生成一个随机数:
Math.random()*(10-1)+1
8.26644050120376
接着我们来使用这三个Math内建函数:
Math.round(8.26644050120376)
8
Math.ceil(8.26644050120376)
9
Math.floor(8.26644050120376)
8
把数值换成8.56644050120376后,再来看看:
Math.round(8.56644050120376)
9
Math.ceil(8.56644050120376)
9
Math.floor(8.56644050120376)
8
所以区别一目了然,对于浮点数,round会遵守四舍五入规则,ceil无论如何贪心进位+1,floor无论如何都小心翼翼的自断一臂-1,至于整数,自己试试看咯。
说到这里,接下来可以正常的描述内容了:
问:如何快速生成一段随机文本,比如验证码或者我们访问网站常见的随机数token。
答案很多,我说一个经典的,其实思路很简单,把刚刚生成随机数的方法随便选择一个.toString():
Math.random().toString(36).substring(7);
//当然也可以写成这样
Math