为什么随机列表中的值始终相同?

时间:2017-02-12 20:00:38

标签: python python-3.x code-testing

此代码适用于最大配对产品,我一直在测试它,但我遇到了一些问题。

import sys
import random
while True:
    a=int(random.randrange(1,1000000,101))
    keys =[]     # keys is empety list
    i=0

    while i < a :
        keys.append(int(random.randrange(1,10000,8)))
        i=i+1

    keys.sort()
    print(keys[-1], keys[-2])
    x=keys[-1]*keys[-2]
    print( "the max is ",x)

但是,由于某种原因,代码的输出始终是相同的。

9993 9993
the max is  99860049
9993 9993
the max is  99860049
9993 9993
the max is  99860049
9993 9993
the max is  99860049

我不明白为什么会发生这种情况,我们将不胜感激。

2 个答案:

答案 0 :(得分:0)

这种情况正在发生,因为您正在对列表进行排序,以便最大数字在最后。列表键将包含数十万个数字,因为只有1249个可能的键(9993 - 1) / 8 = 1249,您很可能会得到两个最大可能数的实例,9993。但是,这不是总是这样,当我运行你的代码一次我得到了不同的结果:

9993 9993
the max is  99860049
9993 9993
the max is  99860049
9977 9969 #<-- Not 9993
the max is  99460713
9993 9993
the max is  99860049

这表明它纯粹是机会,我希望这有帮助!

答案 1 :(得分:0)

问题是你的a,如果硬编码说100就太大那么你会得到欲望的行为

9945 9857
the max is  98027865
9905 9881
the max is  97871305
9969 9881
the max is  98503689
9977 9849
the max is  98263473
9977 9945
the max is  99221265
9713 9617
the max is  93409921
9993 9977
the max is  99700161
9929 9841
the max is  97711289
9881 9761
the max is  96448441
9953 9841

您选择a作为

>>> random.randrange(1,1000000,101)
18181
>>> random.randrange(1,1000000,101)
835069
>>> random.randrange(1,1000000,101)
729524
>>> 

,而您的密钥只从

池中选择
>>> len(range(1, 10000, 8))
1250
>>> 

(或多或少)

只有1250个不同的元素可以选择,当你采取更多的方式(如18181)时,你会得到该范围内的所有可能数字(几次),因此你总能得到相同的结果,并且如此多的尝试你几乎可以保证获得该范围内的最大数量(9993)几次,并且列出这就是为什么你多次得到它的原因。

这被称为Pigeonhole principle

对于您的工作,请考虑使用示例

for _ in range(5):
    a,b = random.sample(range(1,10000,8),2)
    print(a,b)
    print( "the max is ",a*b)

输出

2881 689
the max is  1985009
2329 6473
the max is  15075617
5953 7769
the max is  46248857
9905 3201
the max is  31705905
6897 4713
the max is  32505561