(转载)Math.random()随机数的二三事

本文探讨了JavaScript中Math.random()生成随机数的各种方法,包括如何生成特定范围内的整数,如何生成随机字符串,以及如何实现随机背景色等。通过结合时间戳和其他技巧,可以创建更复杂的随机数生成策略,提高随机性的假定真实性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文地址: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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值