开发者社区> 天行无忌> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

JavaScript 中 Math.random() 生成随机数据

简介: Math.random() 将生成一个介于0(包括)和 1(不包括)之间的伪随机浮点数(带有小数的数),随机数并不意味着总是得到一个唯一的数字,它会在一段时间后产生相同的数字。这里的间隔很长,所以可能不会得到两次相同的数。
+关注继续查看

Math.random() 将生成一个介于0(包括)和 1(不包括)之间的伪随机浮点数(带有小数的数),随机数并不意味着总是得到一个唯一的数字,它会在一段时间后产生相同的数字。这里的间隔很长,所以可能不会得到两次相同的数。

1. 随机布尔值

通过 Math.random() 返回 0-1 之间的随机数,生成随机布尔值。

const randomBoolean = () => Math.random() >= 0.5;
console.log(randomBoolean()); // true
console.log(randomBoolean()); // false
console.log(randomBoolean()); // false

2. 随机数

同样利用通过 Math.random() 返回 0-1 之间的随机数的原理,结果乘以最大数并四舍五入即可获得一个介于 0max 之间的数字。

const randomNumber = (max) => Math.round(Math.random() * max);
console.log(randomNumber(100));

进一步完善上面的方法以可以获取指定最小和最大范围的随机数。

const randomNumber = (min, max) =>
Math.round(Math.random() * (max - min) + min);
console.log(randomNumber(51, 100));

3. 随机 ID

为了生成这个需求,可以借助 toString() 方法,然后把随机数转换成字符串。

const randomID = () => Math.random().toString(36).substring(2);
console.log(randomID()); // 961b4gd0t3

接下来分析一下原理,先来看 toString() 方法:

num.toString(radix)

参数 radix 是介于 236 之间的数字。

Base36是一个二进制到文本编码表示方案的二进制数据以ASCII通过将其转化为一个字符串格式基数 -36 表示。选择 36 十分方便,因为可以使用阿拉伯数字 0–9 和拉丁字母 A–Z [1](ISO基本拉丁字母)表示数字。

Math.random 结果不包括 1 但包括 0。这意味着 randomID 结果是空 "" 的可能性很小,那是因为依赖序列的开头为 0. ,在这种情况下,可以简单地返回0或任何其他的值作为默认字符串id :

const randomID = () => Math.random().toString(36).substring(2) || "0";

4. 随机十六进制数

可以应用上面相同原理来创建一个随机的十六进制数函数(随机颜色),这里将使用 ES7 字符串填充函数:padEnd,如下代码:

const randomHex = () =>
`#${Math.random().toString(16).slice(2, 9).padEnd(6, "0")}`;
console.log(randomHex()); // #2b988b5

如果不想使用 ES7,可以改下以兼容其他版本:

const randomHex = () =>
`#${(0x1000000 + Math.random() * 0xffffff).toString(16).slice(1, 7)}`;
console.log(randomHex()); // #4efabd


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
《JavaScript数据可视化编程》——导读
在我们的日常生活中,数据的重要性与日俱增。尤其对于一些庞大的组织机构(诸如Facebook和Google这种体量的公司)来说,数据几乎是一切决策的核心。在地缘政治领域,正在前所未有地收集数据,以致爆出诸如美国国家安全局监控丑闻这样的事件,这从另一个侧面反映了我们正在经历一个宏观数据时代。
2547 0
+关注
天行无忌
技术改变生活、研发构建未来、细节铸造品质!
255
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载