前几天在淘宝上买双色球,发现上面有一个自动选号的功能,用起来感觉不错,做起来应该也比较简单,于是就打算自己做一个。
由于一开始没有考虑周全,第一个程序虽然很快做了出来,但是测试的时候却发现了几个问题:
第一个问题是,生成的结果中可能会出现相同的数字;第二个问题是,生成出来的数字没有自动排序。
实际上,这是一个比较简单的问题。
只需要在一定的范围内随机取出几个数字,然后解决两个问题:
- 取出的数字不能重复;
- 取出的结果需要进行排序。
如何避免生成重复数字?
首先解决数字重复的问题。
我的思路是先生成一个数字数组,每次从这个数组中随机取出一个数字,然后把这个数字从原数组中删除。
这样,被取出的数字就不会再次参与下一次随机选择,也就可以避免生成重复的数字。
例如:
原数组:
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
欢迎分享你的看法,也欢迎补充不同的实践经验。