试下:不重复不敢说;
for(var i=1;i<=10000;i++)
Math.round(Math.random()*i);

解决方案 »

  1.   

    回复人: xinyunyishui(心云意水) ( ) 信誉:168  2004-11-23 14:57:00  得分: 0  
     
     
       晕死!
    4位的随机数的范围是1000-9999,总共就是10000个,你要9999个随机数?????????
      
     
    1000-9999,总共就是10000个??????????????????
    强,俺手指头不够用,大家帮数一下是不是10000个????
      

  2.   

    你说你想要一个乱序数列就好了,你原题的说法是不对的,如果你要完整的数列,你可以考虑发牌的相关算法,一个效率比较高的算法是对一个有9999个数的等差数列进行处理成为乱序数列。
    不过这样你要一次性申请一个9999个数的数组空间和一个用于交换的中间变量。为了方便起见,你可以直接用整数进行计数,输出的时候才格式化成标准4位。
    一个复杂度为O(N)的算法是
    数组是初始化好的数组NUM[N],算法计算后也是输出结果数组,N是你的数列元素数。
    \\对数数组进行初始化操作
    \\-------------算法开始---------------
    for (i=0,i<N,++1)
       {
        tmp=NUM[i];
        rnd=random()\\获取一个0到9998的随机整数rnd,这一步可能不对,我只提供算法。
        NUM[i]=NUM[rnd];
        NUM[rnd]=tmp;
        }
    \\-----------算法结束------------------
    \\这时你依次输出数组NUM就是你要的乱序数列了,而且肯定不存在重复。
    \\一般其他的发牌算法都存在可能不能结束循环的问题, 比如ygjwjj(塔克拉玛干---胡杨林)的方法
    而 logicpig(南无) 的方法说起来简单,但实际操作时随着N的增大,会很麻烦,而且也存在不能获得的可能,比较随机数的获取是随机的(理论上的),理论上每个值的获得概率是相同的,但这是建立在巨大的尝试次数上的,而且对有限的计数,就很有可能有些数始终不出现。
      

  3.   

    function numbers(numbercount,maxnumbers) {if (numbercount > maxnumbers) 
    { alert("Be sure to select a correct maxnumbers!");}else 
    { var ok = 1; r = new Array (numbercount); for (var i = 1; i <= numbercount; i++) 
    { r[i] = Math.round(Math.random() * (maxnumbers-1))+1; } for (var i = numbercount; i >= 1; i--) 
    { for (var j = numbercount; j >= 1; j--) 
    { if ((i != j) && (r[i] == r[j])) ok = 0;  }    } if (ok) //随机数生成成功
    { for (var k = 1; k <= numbercount; k++) 
    { alert(r[k]); }
    }      else numbers();}}
      

  4.   

    coolroy2000(coolroy)的算法很可能不能提供结果,可以这么说,这段程序很可能成为死循环。
     你还是要在洗牌算法中找。