随机洗牌问题

仍然是上一篇中那个公司的笔试题(编程题无语言要求),给一副扑克牌随机洗牌无规律可循,仍然是写出思路和流程图还有程序;当时写的是1.把牌分成6*9即6组每组9张   2.六组中进行两两分配然后进行交叉洗牌,当时不知道问什么用分治法解决,既增加课空间复杂度而且增加了空间复杂度,现在写出新的思路,可能算法的选择任然不是最好的,但是不失为一种解决方案:

1.随机生成1~54中的两个数如果相等则终止继续for循环

2.如果不相等则对数组值进行交换

其中1中的for循环的循环上限设为<30仅为猜想54个位置可重复两两随机交换30次完全可以打乱,至于具体最佳数字的判断,想了一下没有分析出来具体代码如下:

<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>

 

对这两道题的解决算是博文的开端吧

posted on 2013-09-14 20:32  前端小码农  阅读(309)  评论(0编辑  收藏  举报

导航