随机洗牌问题
仍然是上一篇中那个公司的笔试题(编程题无语言要求),给一副扑克牌随机洗牌无规律可循,仍然是写出思路和流程图还有程序;当时写的是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>
对这两道题的解决算是博文的开端吧