首页 > 代码编程 > 前端开发 > js 不重复随机数(生成不重复的随机数(JS))

js 不重复随机数(生成不重复的随机数(JS))

2023-06-29 前端开发 136 ℃ 0 评论

什么是不重复随机数?

不重复随机数是指在生成一组随机数的过程中,确保每个数值仅出现一次。在JS中,常常需要生成一组不重复的随机数,例如生成验证码、抽奖等场景。因此,了解如何生成不重复随机数是非常必要的。

常见的生成随机数方法

在JS中,有很多生成随机数的方法,但大多数都存在一定程度的重复问题。

首先,Math.random()是最常用的生成小于1随机数的方法。但是它只能生成0到1之间的伪随机数,而且每个数值的出现概率相同。使用该方法生成大量数值时,很容易出现重复的情况。

其次,可以使用Date对象生成随机数。例如,new Date().getTime()会返回当前时间的时间戳,可以作为随机数的值。但是同样存在重复的问题,因为多次调用该方法时可能会返回相同的值。

生成不重复随机数的方法

为了生成不重复的随机数,我们可以采用以下方法之一:

1. Fisher-Yates shuffle算法

Fisher-Yates shuffle算法(或称洗牌算法)是一种随机排序算法,可以生成不重复的随机数。该算法的基本思想是在数组中随机选取一个数,然后将其与数组末尾的数交换位置,再从数组前面选取一个数,并将其与数组倒数第二个数交换位置,以此类推,直到数组中所有元素都参与了交换。

以下是使用Fisher-Yates shuffle算法生成不重复随机数的实现代码:

```javascript

function shuffle(arr) {

for (let i = arr.length - 1; i >= 0; i--) {

const j = Math.floor(Math.random() * (i + 1));

[arr[i], arr[j]] = [arr[j], arr[i]];

}

return arr;

}

```

使用上述方法,将数组内的所有元素随机排序,再取前n个元素即可生成不重复随机数。

2. Set数据结构

Set是ES6中引入的一种新的数据结构,可以存储不重复的值。我们可以创建一个Set集合,将所有可能出现的随机数存储在其中,然后从集合中随机取出一个数,并将该数从集合中删除,以保证不重复出现。

以下是使用Set数据结构生成不重复随机数的实现代码:

```javascript

function uniqueRandom(arr, count) {

const set = new Set(arr);

const result = [];

while (result.length

const random = Math.floor(Math.random() * arr.length);

if (set.has(arr[random])) {

result.push(arr[random]);

set.delete(arr[random]);

}

}

return result;

}

```

使用上述方法,可以生成指定数量的不重复随机数。

总结

在JS中生成不重复随机数是一个常见的需求,我们可以使用Fisher-Yates shuffle算法或Set数据结构来解决该问题。

在使用随机数时,需要注意随机数的范围和生成次数,以确保生成的随机数满足我们的要求。

炮渣日记