宝玉

专注于web开发技术
随笔 - 114, 评论 - 1517 , 引用 - 583

洗牌的算法

我对算法一向不太感冒,一般都是用些中规中矩的算法。

前不久要写一个“洗牌”的算法,其实就是将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>

发表于 2004年7月12日 15:09

评论

# re: 洗牌的算法

2004-7-22 16:18 | hvzhang

# re: 洗牌的算法

108张牌
2005-1-20 9:03 | bb,l,,m

# re: 洗牌的算法

为什么我就写不出来
2006-6-3 1:53 | hbjswj

# re: 洗牌的算法

不通用
2006-10-7 7:54 | s2smhfrom2005

# re: 洗牌的算法

如果随机数有重复的怎么办?
2006-11-26 5:02 | 呵呵

# re: 洗牌的算法

楼主,你真牛
2007-6-7 4:07 | xp

# re: 洗牌的算法

随机时 每张牌被选中的几率不同,算法不完美。
2007-6-27 6:06 | fee

# re: 洗牌的算法

巧妙的洗牌算法~~
2007-8-10 23:16 | 不是董夕

# re: 洗牌的算法

Math.random();的复杂度不清楚,还不能说是一个好算法,想想是不是,呵
2007-10-4 0:40 | fdf

# re: 洗牌的算法

<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-i) * rnd)+i; //(i-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>


2007-10-5 22:49 | fdf

# re: 洗牌的算法

这样并没有做到随即。。同学。。作为一个简单的要求不高的程序可以这么用,但是如果要的是真正的随即洗牌,这个不行。
2007-12-14 0:55 | oday

# re: 洗牌的算法

看你的用途如何啊 ,对随机性要求不严格的应用的话,可以。但是对随机性要求高的场合就不行了,例如加密。
2008-4-7 10:03 | asxinyu

Post Comment

主题  
姓名  
主页
校验码  
内容   
京ICP备 05050892号