<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>
<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>
poker=new Array();
//把牌存到数组
....
//每次发牌都不改变原来的牌
var tmp=poker;
while(tmp.length!=0)
{
ind=Math.random()*tmp.length;
//发出这张牌
the_poker=tmp[ind];
...
tmp.splice(ind,1);
}
ar.sort(new Function("return .5-Math.random()")).sort(new Function("return .5-Math.random()"));以前秋水还说过另一个更简练的方法的,可惜他放假了,问不到,一时也找不出来那篇帖子了。
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;
}
=================================
<!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">♠</font><font size=6>'+change(p)+'</font> '}
if(p>13&&p<=26){str+='<font size=20 color="red">♥</font><font size=6>'+change(p)+'</font> '}
if(p>26&&p<=39){str+='<font size=20 color="#000000">♣</font><font size=6>'+change(p)+'</font> '}
if(p>39){str+='<font size=20 color="red">♦</font><font size=6>'+change(p)+'</font> '}
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>
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);
}
好,snakeli(李佳) 说的就是这个意思,但是为什么swap了100次呢?这个100是从哪里来的?是否是最合理的?
===========
100是为了充分的洗牌,1000就更充分
一个54/52的包含1-54/52的整数数组,在第n次(1<=n<54/52)随机取1-54/52的数k,把第n个元素与第k个元素交换,这个算法的时间复杂度和空间复杂度都是常数,而且是完全模拟人洗牌的过程,最后产生的数组就直接可以用来发牌了(对需要发牌的人的数目取余来发给人)
1、如果你只洗一遍牌肯定不如两边牌混乱,听说只要洗7遍牌就可以了,即使你用电脑洗牌,她和人手洗有区别,但是你要记住没有真正意义的random函数。
所以1000比100充分。
2、随机两张牌交换位置不也就是模拟洗牌的过程,所以她更应该使用一个循环来确定洗牌的时间,这个时间也可以随机了。这样才是模拟了洗牌。
<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>但是谁会这样洗牌呢?
多洗几遍牌是为了能够弥补random的不足,看看计算机原理你就会知道为什么没有真正的随机函数
--------------------------------------------------------------------random是否真正随机是另一个问题。现在的问题是假设random是真正的随机函数的情况下,到底要洗几遍?