【发布时间】:2014-01-06 03:39:21
【问题描述】:
我知道这个标题听起来很无聊,因为很多人已经问过这个话题了。我希望它可以帮助我深入了解随机模块的工作原理。问题是,我写了两个我认为应该相同的不同函数,但我得到的结果并不相同,我不明白为什么。
我希望最终得到一个“洗牌良好的套牌”。我只关心卡片是红色还是黑色,所以我的套牌很简单。我称“1”为红色,“0”为黑色。
我的想法是在 random.random() > .5 时添加 1(红色),否则添加 0(黑色),然后在我达到 26 时自动添加 1 或 0(甲板的一半)一种颜色。但是出了点问题。 deckmaker() 不能正常工作,但 deckmaker2() 可以。谁能提供见解?
import random
def deckmaker():
deck = []
for i in range(52):
if deck.count(0) == 26:
deck.append(1)
elif deck.count(1) == 26:
deck.append(0)
elif random.random() > .5:
deck.append(0)
else:
deck.append(1)
return deck
def deckmaker2():
newdeck = []
for i in range(26):
newdeck.append(0)
for i in range(26):
newdeck.append(1)
deck = []
for i in range(52):
x = random.randint(0,len(newdeck)-1)
deck.append(newdeck.pop(x))
return deck
注意:在写这个问题时,我发现了 random.shuffle 列表操作符,它和我的第二个函数做同样的事情,所以得到洗牌的牌组当然很容易。但我仍然想知道为什么我的原始代码没有做同样的事情。
已编辑:很抱歉对deckmaker() 的确切问题含糊其辞。问题是,我不完全明白出了什么问题。这与它产生的牌组有关,当你一张一张“翻”牌时,有一些策略可以让你预测“下一张牌”是红色还是黑色使用使用 random.shuffle 创建的套牌
编辑 2: [更多信息] 我将解释我是如何确定 Deckmaker 不起作用的,以防万一。 我正在编写这个程序来模拟这里发布的谜题:http://www.thebigquestions.com/2013/12/17/tuesday-puzzle-4/
我的策略是记住最近发的几张牌,并使用这些信息来确定何时决定拿下一张牌。我想也许在连续获得 5 张“黑色”牌之后,是预测“红色”的好时机。我是这样实现的:
mycards = []
for j in range(1000):
mydeck = deckmaker(52)
mem_length = 5
mem = []
for c in range(mem_length):
mem.append(4)
for i in range(len(mydeck)):
if mem.count(0) == mem_length:
mycards.append(mydeck[i])
break
elif i == len(mydeck)-1:
mycards.append(mydeck[i])
break
else:
mem.append(mydeck[i])
mem.pop(0)
x = float(mycards.count(1))
print x/len(mycards)
结果,超过一半的牌(放入我的牌列表)是“红色的”,这是我在连续抽出 5 张 红色 牌后拿下这张牌的结果。这毫无意义,所以我寻找了一种不同的方式来创建套牌并得到了更正常的结果。但我仍然不知道我原来的套牌出了什么问题。
【问题讨论】:
-
“deckmaker 无法正常工作”... 有什么问题?它似乎对我有用。
-
对不起,我当然应该更具体,但我自己不太明白这个问题。如果有帮助,我将添加我用来确定问题存在的代码。
-
这是另一种提问方式:当您说“deckmaker 无法正常工作”时,是什么导致您得出这个结论?程序是否产生了您所期望的输出,如果是,输出是什么?您认为它会做什么?
标签: python algorithm random shuffle