WEB开发网
开发学院网页设计JavaScript javascript获取不重复的随机数的方法比较 阅读

javascript获取不重复的随机数的方法比较

 2010-09-14 13:29:14 来源:WEB开发网   
核心提示:不重复的随机数方案1:1531 毫秒一般的思路是先创建一个1-3000的数组,每一次取出一个,javascript获取不重复的随机数的方法比较,然后让这个数组减少一个, 取一个,因为方案2运行到越后面,原始数组为null的频率就越高,减少一个,这样就可以做到永不重复了

不重复的随机数方案1:1531 毫秒

一般的思路是先创建一个1-3000的数组,每一次取出一个,然后让这个数组减少一个, 取一个,减少一个,这样就可以做到永不重复了。

运行可以看到效果

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>随机不重复_www.jb51.net</title>
<script type="text/javascript">
var count=3000;
var original=new Array;//原始数组
//给原始数组original赋值
for (var i=0;i<count;i++){
original[i]=i+1;
}
var d1=new Date().getTime();
for (i=0;i<count;i++){
var index=Math.floor(Math.random()*original.length); //随机取一个位置
document.write(index+" , "); //打印
original.splice(index,1)
}
var d2=new Date().getTime();
document.write("运算耗时"+(d2-d1));
</script>
</head>
<body>
<a href=http://www.jb51.net>脚本之家</a>
</body>
</html>
不重复的随机数方案2:297毫秒

但是方案1采用了slice方法,此方法重新生成数组,会大量占用内存和cpu运算, 效率很低,所以改良一下,从原始数组取出一个数, 然后让原始数组的这个位置赋值为null 。这样下一次取数的时候判断如果为null就不取,直到不为null为止。 经过测试,可以显著提高效率。

运行可以看到效果

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>随机不重复_脚本之家_www.jb51.net</title>
<script type="text/javascript">
var count=3000;
var original=new Array;//原始数组
//给原始数组original赋值
for (var i=0;i<count;i++){
original[i]=i+1;
}
var d1=new Date().getTime();
for (var num,i=0;i<count;i++){
do{
num=Math.floor(Math.random()*count);
}while(original[num]==null);
document.write(original[num]+" , ");
original[num]=null;
}
var d2=new Date().getTime();
document.write("运算耗时"+(d2-d1));
</script>
</head>
<body>
<a href=http://www.jb51.net>脚本之家</a>
</body>
</html>
不重复的随机数方案3:234毫秒

换一个思路,如果把原始数组origin打散,然后再依次打印,

这样也可以做到随机永不重复,而且效率更高,

因为方案2运行到越后面,原始数组为null的频率就越高,运算的次数就越多。

运行可以看到效果

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>随机不重复_www.jb51.net</title>
<script type="text/javascript">
var count=3000;
var original=new Array;//原始数组
//给原始数组original赋值
for (var i=0;i<count;i++){
original[i]=i+1;
}
var d1=new Date().getTime();
original.sort(function(){ return 0.5 - Math.random(); });
for (var i=0;i<count;i++){
document.write(original[i]+" , ");
}
var d2=new Date().getTime();
document.write("运算耗时"+(d2-d1));
</script>
</head>
<body>
<a href=http://www.jb51.net>脚本之家</a>
</body>
</html>

Tags:javascript 获取 重复

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接