<BODY>
<SCRIPT LANGUAGE="JavaScript">
<!--
var n=52
var ar = new Array();
function compare(arg1,arg2){
return arg1[1]-arg2[1];
}for (var i=0;i<n;i++){
ar[i] = [i+1,Math.random()];
}
ar.sort(compare);
for (var i=0;i<n;i++){
document.write(ar[i][0]+"<br>");
}
//-->
</SCRIPT>
</BODY>

解决方案 »

  1.   

    把派存倒数组,可以这样发排,每次随机一张牌的索引,把这张牌发出去,然后从数组中删掉这张牌,然后继续随机下一张
    poker=new Array();
    //把牌存到数组
    ....
    //每次发牌都不改变原来的牌
    var tmp=poker;
    while(tmp.length!=0)
    {
       ind=Math.random()*tmp.length;
       //发出这张牌
       the_poker=tmp[ind];
       ...
       tmp.splice(ind,1);
    }
      

  2.   

    嗯,我模拟的是洗牌, llrock(百乐宝||昨夜星辰) 模拟的是随机发牌(另一帖中gzh_seagull(不可)说的也是这个意思),其实都是可以的。当然还可以这样洗牌:
    ar.sort(new Function("return .5-Math.random()")).sort(new Function("return .5-Math.random()"));以前秋水还说过另一个更简练的方法的,可惜他放假了,问不到,一时也找不出来那篇帖子了。
      

  3.   

    deck=new array();
    for(i=1;i<=52;i++)
      deck[i]=i;
    for(i=1;i<=100;i++)
    {
      swap(Math.random()*52,Math.random());
    }
    function swap(x,y)
    {
      var temp=deck[x];
      deck[x]=deck[y];
      deck[y]=temp;
    }
      

  4.   

    好,snakeli(&#26446;&#20339;) 说的就是这个意思,但是为什么swap了100次呢?这个100是从哪里来的?是否是最合理的?
      

  5.   

    除夕夜来看看,顺便混点分,过年好呀!
    =================================
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
    <HTML>
    <HEAD>
    <TITLE> New Document </TITLE>
    <META NAME="Generator" CONTENT="EditPlus">
    <META NAME="Author" CONTENT="">
    <META NAME="Keywords" CONTENT="">
    <META NAME="Description" CONTENT="">
    </HEAD>
    <BODY>
    人数: <input id=playercount value=4>  每人牌数:  <input id=pokercount value=13><BR>
    <input type=button value="发排" onclick="deal(playercount.value,pokercount.value)">
    <HR>
    <span id=result></span>
    <SCRIPT LANGUAGE="JavaScript">
    <!--
    function deal(plyc,pokc)
    {
       if(isNaN(plyc)||isNaN(pokc))return alert("please input a number");
       if(plyc*pokc>52)return alert(plyc+"*"+pokc+">52.\ninput againt!");
       //--------
       pokers=new Array();
       for(i=0;i<52;++i)
         pokers[i]=i+1;
       str="";
       Math.random();
       for(i=0;i<plyc;++i)
       {
          str+="PLAYER "+i+" : ";
          for(j=0;j<pokc;++j)
      {
         ind=Math.floor(Math.random()*pokers.length)
         p=pokers[ind];
     if(p<=13){str+='<font size=8 color="#000000">&spades;</font><font size=6>'+change(p)+'</font>&nbsp;&nbsp;'}
     if(p>13&&p<=26){str+='<font size=20 color="red">&hearts;</font><font size=6>'+change(p)+'</font>&nbsp;&nbsp;'}
     if(p>26&&p<=39){str+='<font size=20 color="#000000">&clubs;</font><font size=6>'+change(p)+'</font>&nbsp;&nbsp;'}
     if(p>39){str+='<font size=20 color="red">&diams;</font><font size=6>'+change(p)+'</font>&nbsp;&nbsp;'}
     pokers.splice(ind,1);
      }
      str+="<BR>";
       }
       result.innerHTML=str
    }
    function change(p)
    {
      p%=13;
      switch(p)
      {
        case 0 : p="K";break;
    case 1 : p="A";break;
    case 11: p="J";break;
    case 12: p="Q";break;
    default: break;
      }
      return p;
    }
    deal(playercount.value,pokercount.value)
    //-->
    </SCRIPT>
    </BODY>
    </HTML>
      

  6.   

    emu(ston) ( ) 信誉:135 ar.sort(compare);这个句子是什么用法啊?
      

  7.   

    返回一个元素已经进行了排序的 Array 对象。 语法
    arrayobj.sort(sortfunction) 
    sortfunction 参数是用来确定元素顺序的函数的名称。如果这个参数被省略,那么元素将按照 ASCII 字符顺序进行升序排列。 说明
    sort 方法将 Array 对象进行适当的排序;在执行过程中并不会创建新的 Array 对象。 
    如果为 sortfunction 参数提供了一个函数,那么该函数必须返回下列值之一: 负值,如果所传递的第一个参数比第二个参数小。 
    零,如果两个参数相等。 
    正值,如果第一个参数比第二个参数大。 
    下面这个例子说明了 sort 方法的用法: function SortDemo()
    {
      var a, l;
      a = new Array("X" ,"y" ,"d", "Z", "v","m","r");
      l = a.sort();
      return(l);
    }
      

  8.   

    回复人: emu(ston) ( ) 信誉:135  2003-01-31 11:32:00  得分:0 
     
     
      好,snakeli(&#26446;&#20339;) 说的就是这个意思,但是为什么swap了100次呢?这个100是从哪里来的?是否是最合理的?
      
     
    ===========
    100是为了充分的洗牌,1000就更充分
      

  9.   

    发牌程序是一个十分经典的随机全排序问题,这个问题在算法版是多次讨论的,你可以到算法版去看看,我一般是把洗牌和发牌结合起来的,算法描述如下:
    一个54/52的包含1-54/52的整数数组,在第n次(1<=n<54/52)随机取1-54/52的数k,把第n个元素与第k个元素交换,这个算法的时间复杂度和空间复杂度都是常数,而且是完全模拟人洗牌的过程,最后产生的数组就直接可以用来发牌了(对需要发牌的人的数目取余来发给人)
      

  10.   

    “把第n个元素与第k个元素交换”比man_la123(tommy)的swap(Math.random()*52,Math.random());要合理些,只要52次就可以确保达到比较混乱的状态。
      

  11.   

    emu(ston) :
    1、如果你只洗一遍牌肯定不如两边牌混乱,听说只要洗7遍牌就可以了,即使你用电脑洗牌,她和人手洗有区别,但是你要记住没有真正意义的random函数。
    所以1000比100充分。
    2、随机两张牌交换位置不也就是模拟洗牌的过程,所以她更应该使用一个循环来确定洗牌的时间,这个时间也可以随机了。这样才是模拟了洗牌。
      

  12.   

    多洗几遍牌是为了能够弥补random的不足,看看计算机原理你就会知道为什么没有真正的随机函数
      

  13.   

    所谓7遍的传说是这么来的:
    <SCRIPT LANGUAGE="JavaScript">
    <!--
    var ar=[];
    for (var i=0;i<52;i++) ar[i]=i+1;function swap(){
    var a1=[],a2=[];
    for (var i=0;i<26;i++){
    a1[i]=ar[i];
    a2[i]=ar[i+26]
    }
    ar=[];
    for (var i=0;i<26;i++){
    ar[i+i]=a1[i];
    ar[i+i+1]=a2[i];
    }
    }
    document.write(ar+"<br>");
    for (var i=1;i<9;i++){
    swap();
    document.write("第"+i+"遍:<br>"+ar+"<br>");
    }
    //-->
    </SCRIPT>但是谁会这样洗牌呢?
      

  14.   

    --------------------------------------------------------------------
    多洗几遍牌是为了能够弥补random的不足,看看计算机原理你就会知道为什么没有真正的随机函数
    --------------------------------------------------------------------random是否真正随机是另一个问题。现在的问题是假设random是真正的随机函数的情况下,到底要洗几遍?