比如a是的你的数组 然后根据a数组里面每个对象的id属性排序:
var a = []
a.sort(function (o, p) {
return o.id - p.id
})
就是生成无重复随机数了。我跟你说下原理,代码的话你自己就明白了。每次生成一个随机数,再判断生成的随机数,是否存在于已经生成的随机数群组中,如果存在,则重复执行生成随机数这个动作。
这样就可以保证生成的随机数没有重复。而且位置也没有一定的规律。
我查了下手册,还有一个更简单的方法就是使用函数:shuffle( array &array )
该函数的作用是随机打乱一个数组。
这样就简单了,你先生成一个数组(1-100),然后使用此函数将数组随机打乱,这样就生成了无重复的随机数组。
以下代码亲测可行。
<?php
$numbers = range(1,100)//生成1-100之间的数组。
srand((float)microtime()*1000000)//建立随机种子
shuffle($numbers)//打乱数组
$i=0//换行标记
foreach ($numbers as $number) {//遍历数组
$i++//标记自增
echo "$number "//输出数值
if($i %10==0) echo "<br>"//如果输出10个则换行。
}
?>
MD写完了,发现你问的是JS的,我回答的是PHP的,不过方法1是通用的。JS中不知道有没有这样的函数。
js生成随机数主要用到了内置的Math对象的random()方法。用法如:Math.random()。它返回的是一个 0 ~ 1之间的随机数。有了这么一个方法,那生成任意随机数就好理解了。比如实际中我们可能会有如下的需要:
(1)生成一个 0 - 100 之间的随机整数,那么则可以:
parseInt(100*Math.random())
注意:因为Math.random()的返回值是包括0和1的,所以这里是有生成0和100的可能性的。
(2)生成一个从 m - n 之间的随机整数,例如要生成一个 5 - 15
之间的随机数,则可以:
parseInt(Math.random()*(15-5+1) + 5)
概括即为:
parseInt(Math.random()*(n-m+1)+m)//生成一个从 m - n 之间的随机整数
另外根据需要总结了另外两种常用到的方法,如下:
(3)生成指定位数的随机整数
function randomNum(n){
var t=''
for(var i=0i<ni++){
t+=Math.floor(Math.random()*10)
}
return t
}
(4)生成指定范围内的随机整数
function randomNum(minNum,maxNum){
switch(arguments.length){
case 1:
return parseInt(Math.random()*minNum+1)
break
case 2:
return parseInt(Math.random()*(maxNum-minNum+1)+minNum)
break
default:
return 0
break
}
}
例如生成 2 - 9之间的随机整数,则:randomNum(2,9),生成 1 - 22之间随机整数,则:randomNum(22)
①从0~6中生成3个随机数。
②判断3个随机数是否相等,不相等则执行隐藏操作。
③3随机数有重复,则重新执行函数。
实现:生成0~6的一个随机数
复制代码
代码如下:
var ran1=parseInt(Math.random()*7)
//Math.random()生成[0,1)的一个随机数
完整代码:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/htmlcharset=utf-8" />
<script language="javascript" type="text/javascript" src="http://libs.baidu.com/jquery/1.9.0/jquery.js"></script>
<title>挑战题</title>
</head>
<body>
<ul>
<li>0</li>
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>5</li>
<li>6</li>
<li>7</li>
</ul>
<a id="btn" onclick="cli()">简化</a>
</body>
<script>
$(function cli(){
$("#btn").css("cursor","pointer")
if($("#btn").html()=="简化"){
var ran1=parseInt(Math.random()*7)
var ran2=parseInt(Math.random()*7)
var ran3=parseInt(Math.random()*7)//①从0~6中生成3个随机数完成
if(ran1!=ran2&&ran1!=ran2&&ran2!=ran3){ //②判断3个随机数是否相等,不相等则执行操作。
$('li:eq('+ran1+')').css('display','none')
$('li:eq('+ran2+')').css('display','none')
$('li:eq('+ran3+')').css('display','none')
$("#btn").html("更多")
}else{//③3随机数有重复,则重新执行函数。
cli()
}
}
else{
$("li:hidden").css('display','list-item')
$("a:contains('更多')").html("简化")
}
})
</script>
</html>
收获一:
复制代码
代码如下:
var
ran=parseInt(Math.random()*(max-min+1)+min)//生成一个[min,max]区间的一个随机数
收获二:
反思了下,决定写个在一定[min,max]区间,生成n个不重复的随机数的封装函数。
思路一:先生成n个[min,max]区间随机数,比较是否重复,如重复则返回,再次执行。
演示地址:http://jsbin.com/yupuyehuqa/edit?html,js,output
封装函数:
function my_ran(n,min,max){
var arr=[]
for(i=0i<ni++){
arr[i]=parseInt(Math.random()*(max-min+1)+min)
}
for(i=0i<ni++){
for(j=i+1j<nj++){
if(arr[i]==arr[j]){
my_ran(n,min,max)
return fault
}
}
}
return arr
}
思路二:生成第i个[min,max]区间的随机数,并与之前i-1个数比较,如有重复,令i=i-1重复生成第i个随机数。
演示地址:http://jsbin.com/zorunotosi/edit?html,js,output
封装函数:
function my_ran2(n,min,max){
var arr=[]
for(i=0i<ni++){
arr[i]=parseInt(Math.random()*(max-min+1)+min)
for(j=0j<ij++){
if(arr[i]==arr[j]){
i=i-1
break
}
}
}
return arr
}
思路三:生成[min,max]区间的一个顺序数组,打乱数组,输出前n个值。
演示地址:http://jsbin.com/zorunotosi/edit?html,js,output
封装函数:
function my_ran3(n,min,max){
var arr=[]
var arr2=[]
for(i=0i<max-min+1i++){
arr[i]=i+min
}
for(var j,x,i=arr.lengthij=parseInt(Math.random()*i),x=arr[--i],arr[i]=arr[j],arr[j]=x)
for(i=0i<ni++){
arr2[i]=arr[i]
}
return arr2
}
思路四:生成[min,max]区间的一个顺序数组,从中随机选出一个值,然后在数组中删掉这个值,再选第二个随机值。
演示地址:http://jsbin.com/zorunotosi/edit?html,js,output
封装函数:
function my_ran4(n,min,max){
var arr=[]
var arr2=[]
for(i=0i<max-min+1i++){
arr[i]=i+min
}
for(i=0i<ni++){
var x=parseInt(Math.random()*arr.length)
arr2[i]=arr[x]
for(j=xj<arr.lengthj++){
arr[j]=arr[j+1]
}
arr.length=arr.length-1
}
return arr2
}