javascript创建不重复随机数

June 1, 2008 - by Macji - HTML/CSS/JS/PHP - javascript

有这么一个需求:CMS在页面一容器内输出50个a标签(该容器为display:none),要我随机从这容器取出10个a,放到另一容器内。


本能反应:建立一个随机数组,然后clone节点,放到另一容器去。但这样会把重复的a节点放进去。


随机数不重复,那就得用生成一个随机数,放到数组去,再生成一个和之前的数组一个一个比过去,如果重复就重新生成。我的最初想法。


(function(){
	var obj = $("hotClick");//容器,里面有个隐藏的p,他里面有50个a
	var links = obj.getElementsByTagName("a"), r = [], temp;
	var randomNum = function(n, p){
		var p = p || -1, newNum = Math.floor(Math.random() * (n + 1));
		for(var i = 0; i < r.length; i++){
			if(r[i] == newNum)
				return randomNum(n, newNum);
			}
			return newNum;
		}
	}
	for (var i = 0; i < 10; i++){
		r.push(randomNum(50));
		temp = links[r[i]].cloneNode(true);
		obj.appendChild(temp);
	};
})();

虽然这样可行,但效率比较差劲,于是google了一下,看到无忧脚本一个帖子。于是我想到了,先生成0到50的数组,然后对数组随机排序,最后取输出的0到10拿出来用。太帅了。我对帖子上的方法简单的修改。


(function(){
	Array.prototype.riffle = function(){
		this.sort(function(){
			return Math.random() > 0.5 ? -1 : 1;
		});
	}
	var obj = $("hotClick");
	var links = obj.getElementsByTagName("a"), r = [], temp;
	for(var i = 0; i <= 50; i++)r[i] = i;
	r.riffle();
	for (i = 0; i < 10; i++){
		temp = links[r[i]].cloneNode(true);
		obj.appendChild(temp);
	}
})();
本博客所有文章遵循创作共用版权协议,要求署名、非商业、保持一致。转载时请先阅读以上许可协议,并以超链接形式注明出处。
这篇文章发表于2008年06月01日 09:48:36, 并被分类于HTML/CSS/JS/PHP. 您可以通过订阅 RSS 2.0 跟踪对这篇文章的评论, 也可以发表你的评论, 或者在您自己的网站中引用(trackback)该篇日志.

当前暂无评论

    发表评论

    添加新评论