免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 7220 | 回复: 1
打印 上一主题 下一主题

我曾经写过的发扑克牌的算法,洗牌思路非常不走常规! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-06-09 08:58 |只看该作者 |倒序浏览
在QQ群里面出了个题目,发52张扑克牌到4个人,要随机,速度足够快。我写了一个,请大家指正。
  1. #!/usr/local/bin/python --
  2. # -*- coding: cp936 -*-
  3. import random,time

  4. class timer:
  5.     def __init__(self):
  6.         self.start= time.time()
  7.     def stop(self):
  8.         self.end= time.time()
  9.         return  "\n 本次运行已用时 %s秒"% (self.end-self.start)

  10. class people:
  11.         #定义四个玩牌的人
  12.         jack = []
  13.         python = []
  14.         java = []
  15.         stephen = []
  16.         def print_jack(self):
  17.             i=0
  18.             tmp = ''
  19.             while i < 13:
  20.                 tmp += self.jack[i]+' '
  21.                 i += 1
  22.             return tmp
  23.         def print_python(self):
  24.             i=0
  25.             tmp = ''
  26.             while i < 13:
  27.                 tmp += self.python[i]+' '
  28.                 i += 1
  29.             return tmp
  30.         def print_java(self):
  31.             i=0
  32.             tmp = ''
  33.             while i < 13:
  34.                 tmp += self.java[i]+' '
  35.                 i += 1
  36.             return tmp
  37.         def print_stephen(self):
  38.             i=0
  39.             tmp = ''
  40.             while i < 13:
  41.                 tmp += self.stephen[i]+' '
  42.                 i += 1
  43.             return tmp

  44. class agent(people):
  45.     def __init__(self):
  46.         #定义一个空的列表存放牌
  47.         self.card = []
  48.         #定义洗牌的次数,并不是越大牌就越乱
  49.         self.count = 52
  50.         #定义一个基本的牌序
  51.         self.base = ['A','2','3','4','5','6','7','8','9','10','J','Q','K']

  52.     def arrangement(self):
  53.         #重新排列纸牌
  54.         i = 0
  55.         while i < 13:
  56.             self.card.insert(0,'黑桃'+self.base[i])
  57.             i += 1
  58.         i = 0
  59.         while i < 13:
  60.             self.card.insert(0,'红桃'+self.base[i])
  61.             i += 1
  62.         i = 0
  63.         while i < 13:
  64.             self.card.insert(0,'草花'+self.base[i])
  65.             i += 1
  66.         i = 0
  67.         while i < 13:
  68.             self.card.insert(0,'方块'+self.base[i])
  69.             i += 1

  70.     def shuffle(self):
  71.         #洗牌
  72.         i = 1
  73.         while i < self.count:
  74.             #产生一个随机数来确定要交换牌的位置
  75.             position = random.randint(0,51)
  76.             #临时取出一张牌准备用来交换位置
  77.             tmp = self.card[position]
  78.             #交换随机位置的牌和第一张牌
  79.             self.card[position] = self.card[0]
  80.             self.card[0] = tmp
  81.             i += 1

  82.     def outcards(self):
  83.         #发牌
  84.         i = 0
  85.         while i < 52:
  86.             if i <= 12:
  87.                 self.jack.insert(0,self.card[i])
  88.             elif i >;= 12 and i <= 25 :
  89.                 self.python.insert(0,self.card[i])
  90.             elif i >;= 25 and i <= 38 :
  91.                 self.java.insert(0,self.card[i])
  92.             elif i >;= 38 and i <= 52 :
  93.                 self.stephen.insert(0,self.card[i])
  94.             i += 1

  95. start=timer()
  96. a=agent()
  97. a.arrangement()
  98. a.shuffle()
  99. a.outcards()
  100. print a.print_jack()
  101. print a.print_python()
  102. print a.print_java()
  103. print a.print_stephen()
  104. print start.stop()
复制代码

另外,0.00999999046326好象是Python中最小计数了,再小就计算成0秒了。

还有python中for比where的速度要快,这个和C语言是反的。

论坛徽章:
0
2 [报告]
发表于 2005-06-11 23:16 |只看该作者

我曾经写过的发扑克牌的算法,洗牌思路非常不走常规!

不错
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP