我有这段代码
import random
b = 20
x = random.randrange(0,b)
y = random.randrange(0,b)
ab = 0
xc = 0
while ab != 10:
if x != y:
x = random.randrange(0,b)
y = random.randrange(0,b)
xc = xc + 1
elif x == y:
print ab
print 'number of tries out of', b, ' : ', xc
ab = ab + 1
xc = 0
y = 999999
它本质上是一个统计程序。我想看到10次尝试需要生成多少次随机数才能匹配。到目前为止我运行这个程序后得到的数字我得到了这些值,我运行程序5次,总共50次尝试。
9
26
6
1
5
109
5
42
12
63
所有这些低数字让我想知道我的程序是否非常幸运或者我的代码出了什么问题。谢谢!
注意:有没有办法让我可以在每个while循环之后将XC加起来,当while循环为true时它可以显示总数?
答案 0 :(得分:1)
我说你有些不走运。
平均值为27.8。但是如果你选择0到20之间的两个数字,那么你希望它们在大约1/20的时间内匹配,因此你希望在得到一个匹配之前等待大约20次。
答案 1 :(得分:1)
使用大量迭代检查它:
#!/usr/bin/env python
import random
max_num = 20
x = random.randrange(0, max_num)
y = random.randrange(0, max_num)
tries = 0
i = 0
iterations = 1000
total_tries = 0
while i < iterations:
if x != y:
x = random.randrange(0, max_num)
y = random.randrange(0, max_num)
tries += 1
else:
print(i)
print('number of tries out of %s : %s ' % (max_num, tries))
total_tries += tries
i += 1
tries = 0
y = -1
print("Average tries: %s" % (total_tries / iterations))
如果我这样做,我每次都会得到~20。
注意:这可以简化为:
#!/usr/bin/env python
import random
max_num = 20
iterations = 1000
total_tries = 0
for i in range(iterations):
print(i)
tries = 0
x = 0
y = -1
while x != y:
x = random.randrange(0, max_num)
y = random.randrange(0, max_num)
tries += 1
print('number of tries out of %s : %s ' % (max_num, tries))
total_tries += tries
i += 1
tries = 0
print("Average tries: %s" % (total_tries / iterations))
答案 2 :(得分:1)
你的逻辑非常奇怪。
您不希望使用人工哨兵值来摆脱循环。只是明确地突破它。
您基本上有两个循环:一个用于迭代试验,另一个用于查看给定试验中需要多少次尝试。不要隐藏那个结构。
请勿使用if
/ else if
覆盖所有案例。这就是else
的用途。
在循环中,在测试之前生成数字,而不是之后。这样你就可以更清楚地做什么了,在循环之前你不需要额外的生成步骤。同样,重新初始化顶部循环中的值,而不是底部。
使用明确的变量名称。如果没有有意义的变量名称,请避免创建变量。您实际上不需要将两个变量设置为random.randrange(0, b)
来比较结果。 OTOH,如果你想简化逻辑并避免写一个看似奇怪的random.randrange(0, b)
与它自身的比较,那么你可以注意到(并且应该能够证明,如果你对这种东西有足够的兴趣来写一个程序),你可以任意选择一个目标值,并获得相同的结果。另外,使用变量来命名您任意选择的数字常量。
您可以在Python中使用+=
来更新变量。
使用打印格式。
import random
range_size = 20
total = 0
iterations = 1000 # or however many
for trial in xrange(iterations):
attempts = 0
while random.randrange(0, range_size) != 0: attempts += 1
print "Trial #{0}: Took {1} tries to match one of {2} numbers.".format(
trial, attempts, range_size
)
total += attempts
print "Average trials: {0}".format(float(total) / iterations)
如果您不需要调试信息,我们可以使用内置函数为我们执行求和和循环逻辑,使事情变得更清晰:
from random import randrange
from itertools import *
range_size = 20
total = 0
iterations = 1000 # or however many
print "Average trials: {0}".format(sum(
sum(takewhile(lambda x: randrange(0, range_size) != 0, repeat(1)))
# I tested that way, but this is probably more logical
# even if it's more verbose:
# len(list(takewhile(
# lambda x: x != 0,
# imap(randrange, repeat(0), repeat(range_size))
# )))
# 'lambda x: x != 0' can also be spelled 'bool' in this context,
# but explicit is better than implicit...
for i in xrange(iterations)
) / float(iterations))