今天無意中聊起洗牌算法,於是就嘗試寫一下這個洗牌算法,不管算法多么簡陋,主要進一步熟悉js語言,鍛煉一下自己。
我的思路,模擬現實中的洗牌常用方法:
1、一開始牌的狀態是有序或者無序的。
2、每次講牌分開兩半,然后用左右手分別將這兩堆牌交叉,得到一個新順序的牌。
3、 將過程2重復n次,即洗好牌。
4、(上面的策略只是自己經常洗牌使用的方法,不一定能公平或者隨機,還請大家多多見諒)
具體代碼如下:

<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>洗牌算法</title> <style> body{ background: #000; color: #fff;} #star p, #end p{ padding: 0px; margin: 0px;display: inline-block;width:5%; color: #f60; height: 22px;} </style> </head> <body> <div> <h3>原始放的牌:</h3> <div id="star"></div> </div> <div id="xipai"> <h3> 需要洗的次數: </h3> <input type="txt" id="num" /> <input type="button" id="begin" value="開始洗牌"/> </div> <div > <h3>洗好的牌:</h3> <div id="end"></div> </div> <script type="text/javascript"> var sBox=document.getElementById("star"); var eBox=document.getElementById("end"); var beginXp=document.getElementById("begin"); var arrPK=[]; //存放撲克的地方 function initi(){ //初始化生成撲克牌 var arr=[]; var a1=["紅桃","方塊","梅花","黑桃"] //a代表紅桃 b代表方塊 c代表梅花 var a2=["1","2","3","4","5","6","7","8","9","10","j","q","k"]; var num=0; for(var i=0;i<a1.length;i++){ for(var j=0;j<a2.length;j++){ arr[arr.length]=a1[i]+a2[j]; } } arr.push("小鬼","大鬼") ; return arr; } arrPK=initi(); sBox.innerHTML="<p>"+arrPK.join("</p><p>")+"</p>"; //最開始生成的牌,在網頁中顯示 //每次洗牌的方法 function xiP(arr1){ var arrTmp1=[]; var arrTmp2=[]; var avPos=parseFloat(arr1.length/2); arrTmp1=arr1.slice(0,avPos); arrTmp2=(arr1.slice(avPos,arr1.length)).reverse(); arr1=[]; //將交叉洗牌的結果重新賦予給數組 while(arrTmp1.length>0&&arrTmp2.length>0){ if(Math.random()>0.5){ arr1.push(arrTmp1.pop()); } else{ arr1.push(arrTmp2.pop()); } } while(arrTmp1.length>0){ arr1.push(arrTmp1.pop()); } while(arrTmp2.length>0){ arr1.push(arrTmp2.pop()); } return arr1; } //洗n次牌 beginXp.addEventListener("click",function(){ var num=Math.floor(document.getElementById("num").value); for(i=0;i<num;i++){ arrPK=xiP(arrPK); } // console.log(arrPK.length); console.log(arrPK); eBox.innerHTML="<p>"+arrPK.join("</p><p>")+"</p>"; //在網頁中顯示洗牌結果 }) </script> </body> </html>
說明:部分代碼沒有考慮兼容性問題,比如事件監聽。特此說明。
結果為:
寫的比較初級,還請高手多批評和指導~