下面2个函数的功能是随机摇号的程序,一个是开始 一个是停止,要求是已经出现过的号码不得再出现,所以我专门设置里一个数组把出现过的号码记录下来,下次生成的随机数先跟数组里的每个比较一下,已经出现的就不在出现,用了这段代码
var repeated=false;
for(var i=1;i<=EntNum;i++)//判断是否号码出现过
    if(iNum==Yaohaoed[i]){ repeated=true;break;}
if(!repeated){
if(iNum<10){   
document.getElementById("stext").innerHTML="00"+iNum;   
}else if(iNum<100){   
document.getElementById("stext").innerHTML="0"+iNum;   
}else{   
document.getElementById("stext").innerHTML=iNum;   
}
比如1-10内基本不会重复,但是如果1-300以内的数字选299个,越到后面就可能会重复的数字,但是有时候又不会重复,我分析了下代码感觉没问题的,为什么还会出现这个问题 ,高手清帮忙 谢谢了
var theTimer;   
var iNum=0;
var EntNum=0;
var Isrecord=false;   
//var repeated=false; 
       
function checkLoad() {
//if (EntNum>=Zsye){ alert("摇号已经结束!"); return false;}
document.getElementById("btnBegin").disabled=true;
document.getElementById("btnStop").disabled=false;

Isrecord=false;   
         iNum=selectFrom(1,Cot);
var repeated=false;
for(var i=1;i<=EntNum;i++)//判断是否号码出现过
if(iNum==Yaohaoed[i]){ repeated=true;break;}

if(!repeated){
if(iNum<10){   
document.getElementById("stext").innerHTML="00"+iNum;   
}else if(iNum<100){   
document.getElementById("stext").innerHTML="0"+iNum;   
}else{   
document.getElementById("stext").innerHTML=iNum;   
}
}    
    theTimer = setTimeout("checkLoad()", 10);   
}   
function selectFrom(iFirstValue,iLastValue){   
    var iChoices =  iLastValue-iFirstValue+1;   
    return Math.floor(Math.random()*iChoices+iFirstValue);   
}   
  
function stopPlay() {
document.getElementById("btnStop").disabled=true;
document.getElementById("btnBegin").disabled=false;
   
    if(Isrecord) return false;
    clearTimeout(theTimer);
EntNum++;
Yaohaoed[EntNum]=document.getElementById("stext").innerHTML;
Isrecord=true;
document.getElementById("hisRecord").innerText=document.getElementById("hisRecord").innerText+document.getElementById("stext").innerHTML+",";   
Addstu();
if (EntNum>=Zsye){ alert("电脑派位已经结束,恭喜派位成功的学生!");document.getElementById("btnStop").disabled=true;document.getElementById("btnBegin").disabled=true;document.getElementById("Receive").disabled=false;}   

解决方案 »

  1.   

    就是说:
    假如你生成的一个数是A
    数组B存储的是已经生成的,那么应该这样处理
    var A,B = [];
    function IsRepeatedData(param)
    isRepeated = false;
    for(i=0;i<B.length;i++)
    {
     if(param==B[i])
     {
      isRepeated = true;
      return isRepeated;
     }
    }
    B.push(param);
    return isRepeated;
    }每次生成一个数A,调用IsRepeatedData(A)验证。
      

  2.   

    Yaohaoed[EntNum]=document.getElementById("stext").innerHTML;
    Yaohaoed[EntNum]=iNum 应该是等价的,问题不在这里
      

  3.   

    document.getElementById("stext").innerHTML="00"+iNum; 
    Yaohaoed[EntNum]=document.getElementById("stext").innerHTML;
    .真是等价的?
      

  4.   

    其实我在后面还是要把Yaohaoed[EntNum] 用 字符串转数字的函数转回来 所以是等价的,我刚开始是用Yaohaoed[EntNum]=iNum 的,其实用这个有问题,刚开始我就是这样用的,iNum 是随机生成的数字还没经过判断是否出现过的,Yaohaoed数组里要存放的是没出现过按了停止后才记录进去的,你用数组比较的方法很好,不过我的也没问题,我现在找出原因了,比较数组是没问题的,假设300个选299个,到了最后的时候不重号数字出现的机会很慢(因为298个出现过的都不能再出现了),所以按了停止后会把页面上还刷新过的数字又记录下来,所以产生重号,所以我在stopPlay()函数的开始处加了一句 if(Yaohaoed[EntNum]==document.getElementById("stext").innerHTML)return就解决了,很感谢你们
      

  5.   

    我现在考虑把产生过的字符串存一个变量里比如 s=s+","+document.getElementById("stext").innerHTML,下次用s.indexOf的方法查找,速度会不会比数组查找要快啊