数字营销 · Web开发 · 基础设施

用 JavaScript 生成不重复的随机数

通过数组随机取数、删除已选元素和数字排序,实现 JavaScript 不重复随机数生成。

前几天在淘宝上买双色球,发现上面有一个自动选号的功能,用起来感觉不错,做起来应该也比较简单,于是就打算自己做一个。

由于一开始没有考虑周全,第一个程序虽然很快做了出来,但是测试的时候却发现了几个问题:

第一个问题是,生成的结果中可能会出现相同的数字;第二个问题是,生成出来的数字没有自动排序。

实际上,这是一个比较简单的问题。

只需要在一定的范围内随机取出几个数字,然后解决两个问题:

  1. 取出的数字不能重复;
  2. 取出的结果需要进行排序。

如何避免生成重复数字?

首先解决数字重复的问题。

我的思路是先生成一个数字数组,每次从这个数组中随机取出一个数字,然后把这个数字从原数组中删除。

这样,被取出的数字就不会再次参与下一次随机选择,也就可以避免生成重复的数字。

例如:

原数组:
1 2 3 4 5 6 7 8
随机取出:
4
删除 4:
1 2 3 5 6 7 8

下一次再进行随机选择时,就不可能再次得到 4 了。

如何自动排序?

把随机取出来的数字保存到另外一个数组中,最后使用 JavaScript 数组的 sort() 方法进行排序即可。

不过这里需要注意,JavaScript 默认的 sort() 是按照字符串进行排序的,所以数字排序时需要自己指定比较函数:

function sortnum(a, b){
return a - b;
}

这样就可以按照数字大小进行排序。

完整代码

最终的代码如下:

function getrand1(min, max, size){
var len = max-min+1;
var arr = new Array();
// 生成指定范围的数字
for(var i = 0; i<len; i++){
arr[i] = min+i;
}

var res = new Array();

// 随机取出数字,并从原数组中删除
for(vari=0; i<size; i++){
var randkey = Math.floor(Math.random() *arr.length);

res[i] = arr[randkey];

arr.splice(randkey, 1);
}

// 数字排序
function sortnum(a, b){
return a - b;
}

return res.sort(sortnum);
}

document.write("红球 "+getrand1(1, 33, 6) + "<br/>");
document.write("篮球 "+getrand1(1, 16, 1) + "<br/>");

执行之后,就可以分别随机生成指定范围内的数字。

例如:

红球 3,8,12,17,25,31
篮球 9

每次重新运行,结果都会发生变化,而且同一组结果中的数字不会重复,并且会自动按照从小到大的顺序排列。

这个方法的核心其实很简单:

先建立一个可供选择的数字池,每随机取出一个数字,就把它从数字池中删除,最后再对结果进行排序。

对于这种在指定范围内随机取出若干个不重复数字的需求,这种方法就可以很方便地解决。

评论0

欢迎分享你的看法,也欢迎补充不同的实践经验。