1.洗扑克牌(乱数排列)
通常会直接想到,随机产生1~N的乱数并将之存入队列中,随后产生的数字存入队列前必须
先检查队列中是否已有重复的数字,如果有这个数就不存入,再重新产生下一个数,运气不好的
话,重复的次数就会很多,程序的执行速度就会变慢,因此这不是一个好方法。以1~52的乱数排
列为例,可以先依序由1到52填入,然后使用循环,并随机产生1~52的数字,将产生的数字当作
索引取出值,并与当前的值相交换,如此就不用担心乱数重复的问题了,队列走访完毕后,所有的
数字也就重新排列了。
import random
N = 52
poker = [i for i in range(0,N+1)]
for i in range(1,N+1):
j = random.randint(1, 52)
tmp = poker[i]
poker[i] = poker[j]
poker[j] = tmp
for i in range(1,N+1):
c = int((poker[i]-1) / 13)
if c==0:
print("桃 ",end='')
elif c==1:
print("心 ",end='')
elif c==2:
print("砖 ",end='')
elif c==3:
print("梅 ",end='')
remain = poker[i] % 13
if remain == 0:
print("K ",end='')
elif remain==12:
print("Q ",end='')
elif remain==11:
print("J ",end='')
else:
print("{} ".format(remain), end='')
if i % 13 == 0:
print(" ")
我们设计一个简单的赌博游戏,游戏规则如下:玩家掷两个骰子,点数为1到6,如果第一次
点数和为7或11,则玩家胜,如果点数和为2、3或12,则玩家输,如果和为其它点数,则记录第一
import random
WON = 0
LOST = 1
CONTINUE = 2
def rollDice():
i = random.randint(0, 5)
j = random.randint(0,5)
return i+j+2
if __name__ == '__main__':
firstRoll = 1
gameStatus = CONTINUE
firstPoint = 0
print("Craps赌博游戏,按Enter键开始游戏****")
while True:
if firstRoll:
sumOfDice = rollDice()
print("玩家掷出点数和:{}".format(sumOfDice))
if sumOfDice==7 or sumOfDice==11:
gameStatus = WON
elif sumOfDice==2 or sumOfDice==3 or sumOfDice==12:
gameStatus = LOST
else:
firstRoll = 0
gameStatus = CONTINUE
firstPoint = sumOfDice
else:
sumOfDice = rollDice()
print("玩家掷出点数和:{}".format(sumOfDice))
if sumOfDice == firstPoint:
gameStatus = WON
elif sumOfDice == 7:
gameStatus = LOST
if gameStatus == CONTINUE:
print("未分胜负")
else:
if gameStatus==WON:
print("玩家赢")
else:
print("玩家输")
c = input("再玩一次?")
if c=='n':
print("游戏结束")
break
firstRoll = 1
3.约瑟夫问题
N = 41
M = 3
man = [0]*N
count = 1
pos = -1
alive = 0
i = 0
while count<=N:
while True:
pos = (pos+1) % N
if man[pos] == 0:
i += 1
if i==M:
i = 0
break
man[pos] = count
count += 1
print("约瑟夫排列")
for i in range(0,N):
print('{} '.format(man[i]),end='')
alive = 2
for i in range(0,N):
if man[i] > alive:
print("D ",end='')
else:
print("L ",end='')
if (i+1) % 5 == 0:
print(" ")
4.排列组合
将一组数字、字母或符号进行排列,以得到不同的组合顺序,例如1 2 3这三个数的排列组合
有:1 2 3、1 3 2、2 1 3、2 3 1、3 1 2、3 2 1。
N = 4
def perm(num, i):
if i<N:
for j in range(i,N+1):
tmp = num[j]
for k in reversed(range(i+1,j+1)):
num[k] = num[k-1]
num[i] = tmp
perm(num, i+1)
for k in range(i, j):
num[k] = num[k+1]
num[j] = tmp
else:
for j in range(1,N+1):
print("{} ".format(num[j]),end="")
print(" ")
if __name__=="__main__":
num = []
for i in range(0,N+1):
num.append(i)
perm(num, 1)
5.格雷码
Gray Code是一个数列集合,每个数使用二进位来表示,假设使用n位来表示每个数,任两个
数之间只有一个值不同,例如以下为3位元的Gray Code:
这里我们使用代码来计算Gray Code,由于Gray Code相邻两数之间只改变一个位元,所以可观 察
Gray Code从1变0或从0变1时的位置,假设有4位元的Gray Code如下:
MAXSIZE = 20
digit = []
n = 3
for i in range(n):
digit.append('0')
print('{} ')
while True:
i = 0
while i < n and digit[i] == '1':
digit = '0'
i += 1
if i == n:
break
else:
digit[i] = '1'
i = 0
while i < n and digit[i] == '0':
i += 1
print("{{} ".format(i+1), end='')
for j in range(i+1,n+1):
if digit[j] == '1':
print(',{}'.format(j+1),end='')
print('}')