隨機洗牌問題

仍然是上一篇中那個公司的筆試題(編程題無語言要求),給一副撲克牌隨機洗牌無規律可循,仍然是寫出思路和流程圖還有程序;當時寫的是1.把牌分紅6*9即6組每組9張   2.六組中進行兩兩分配而後進行交叉洗牌,當時不知道問什麼用分治法解決,既增長課空間複雜度並且增長了空間複雜度,如今寫出新的思路,可能算法的選擇任然不是最好的,可是不失爲一種解決方案:算法

1.隨機生成1~54中的兩個數若是相等則終止繼續for循環編程

2.若是不相等則對數組值進行交換數組

其中1中的for循環的循環上限設爲<30僅爲猜測54個位置可重複兩兩隨機交換30次徹底能夠打亂,至於具體最佳數字的判斷,想了一下沒有分析出來具體代碼以下: dom

<script>
var arr =new Array();
function creat(){
    for(var i=0;i<54;i++){
        arr[i]=i+1;
    } 
    write();
}

function write(){
    for(var i=0;i<54;i++)
    {
        document.writeln(arr[i]);
    }
    alert(arr.length);
}

function exchange(num1,num2){
    var m = num1;
    var n= num2;
    //alert(m+"*"+n);
    if(m!=n)
    {
        return true;
    }
}//

window.onload=function(){
    creat();
    for(var i=0;i<30;i++)
    {
        var iNum1 =Math.round(Math.random()*54);//random隨機生成的數爲0~1間的數字
        var iNum2 =Math.round(Math.random()*54);
        alert(arr[iNum1]+"&"+arr[iNum2]);
        var flag = exchange(arr[iNum1],arr[iNum2]);
        if(flag)
        {
            var t = arr[iNum1];
            arr[iNum1] = arr[iNum2];
            arr[iNum2] = t;
        }
        alert(arr[iNum1]+"&&&&&&&&&&&"+arr[iNum2]);
    }
    write();
}
</script>

 

對這兩道題的解決算是博文的開端吧spa

相關文章
相關標籤/搜索