1. 随机数
一般使用 Math.random() 方法实现随机数。
1.1 [ 0, 1 )
生成 0 ~ 1 之间的随机数
Math.random() // 返回 0 ~ 1 之间的随机数,包含 0 不包含 1。
1.2 [ n, m )
生成 [ n, m ) 范围内的随机数(大于等于n,小于m)
Math.random() * ( m - n ) + n
生成 [ n, m ] 闭区间范围内的随机数
Math.random() * ( m - n + 1 ) + n
生成 ( n, m ) 开区间范围内的随机数
对于整数区间来说,(n,m)意味着不包括 n 和 m,意味着我们
需要确保 m 大于 n+1。
function getRandom(n, m) {
if (m <= n + 1) {
throw new Error('m must be greater than n + 1');
}
return Math.random() * (m - n - 1) + n + 1;
}
如果需要生成随机整数,可以使用两个方法:
Math.round(num):将 num 四舍五入取整;
Math.floor(num):将 num 向下取整,即返回 num 的整数部分。
Math.floor(Math.random() * (m - n)) + n // 这个会更加常用
Math.round(Math.random() * (m - n)) + n
2. 优化
Math.random() 生成随机数是基于特定的算法,由于随机数的生成空间是有限的,因此在生成大量随机数时,可能会出现重复的数字。但在一般情况下,随机性已经足够使用。
有一些优化的方法
2.1 使用 时间戳
function getRandom(){
return Date.now() + Math.random().toString(16).substring(2, 4);
}
通常用于生成唯一标识符,其中时间戳提供了基本的唯一性,随机部分减少了在极短时间内生成重复标识的可能性。但也不是绝对的,在非常高的生成频率下,仍然有可能产生重复的数据。
2.2 使用 Set 集合
function getRandomNumbers(count, max) {
const set = new Set();
while (set.size < count) {
set.add(Math.floor(Math.random() * max) + 1); // +1 是为了从 1 开始,而不是从 0
}
return set;
}
生成 count 个 1 ~ max 之间的不重复随机数。
2.3 使用 Array 数组
function getRandomNumbers(min, max, count) {
// 创建一个包含指定范围内所有数字的数组
const numbers = Array.from({length: (max - min) + 1}, (_, i) => i + min);
// 或者
const numbers = new Array((max - min) + 1).fill(0).map((e, i) => i + 1);
// 打乱顺序
numbers.sort(() => 0.5 - Math.random());
// 返回前count个数字作为结果
return numbers.slice(0, count);
}
生成 min 到 max 之间的 count 个不重复随机数。
以上具体的范围可以自己指定哦!