我对算法一向不太感冒,一般都是用些中规中矩的算法。
前不久要写一个“洗牌”的算法,其实就是将128张牌打乱,抽象到编程上,就是将一个数组的顺序打乱。
一开始想的较复杂:循环,然后每次从数组中随机抽取一个未抽取的,关键是不能抽到已经抽取过的,所以就有些麻烦了。
后来就联想到实际生活中,我们在洗牌的时候,是将牌两两错开,抽象到编程上,那就是将数组中随机两两交换,对数组一次循环即可搞定:)
<html>
<head>
<title> JS版拖拉机 </title>
<meta name="Author" content="宝玉" />
<meta name="Keywords" content="JS版 拖拉机" />
<script language="javascript">
<!--
var len = 128;
var cards = new Array();
for(var i=0;i<len;i++)
{
cards[i] = i;
}
function RandCards()
{
var rnd,j,k,tmp;
for(var i=0;i<len;i++)
{
rnd = Math.random();
j = parseInt(len * rnd); //0-127之间的随机数
//两两交换
tmp = cards[i];
cards[i] = cards[j];
cards[j] = tmp;
}
document.body.innerHTML += "<div style='width:500px;word-break:break-all;'>"+cards.join(";")+"</div><br /><br />";
}
// -->
</script>
</head>
<body onclick="RandCards();">
点击输出结果
</body>
</html>