思路

在回调函数中生成一个用于储存随机数的数组,通过长度取出一个随机数用作下标,函数每次执行的时候判断数组为空则重新初始化

这样保证每次随机的数都不重复,并且一定是没有出现过的数。


原来是这样的

1
num = Math.floor(Math.random() * theme.cover.default_cover.length) 

简单粗暴,虽然能实现,但是有时候会出现两篇文章一模一样的图。


我修改后的完整代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
function randomCover() {
const theme = hexo.theme.config
let cover
let num
/*初始化随机数组 */
if (!global.mNumArr || !global.mNumArr.length) {
global.mNumArr = []
for (var i = 0; i < theme.cover.default_cover.length; i++) {
global.mNumArr.push(i)
}
}

if (theme.cover && theme.cover.default_cover) {
if (!Array.isArray(theme.cover.default_cover)) {
cover = theme.cover.default_cover
return cover
} else {
/* num = Math.floor(Math.random() * theme.cover.default_cover.length) */

/*随机生成数组的下标,取出后删除 */
let mRondomIndex = Math.floor(Math.random() * global.mNumArr.length)
num = global.mNumArr.splice(mRondomIndex, 1)
cover = theme.cover.default_cover[num]
return cover
}
} else {
cover = 'https://npm.elemecdn.com/butterfly-extsrc@1/img/default.jpg'
return cover
}
}

如果文章数比图片多也会重复,但比直接取随机数好多了