Python程序输出不同的结果,即使没有使用随机

时间:2017-09-04 09:42:35

标签: python python-3.x

我正在尝试解决Project Euler Problem 19

我不是来问这个问题的答案,但我注意到每次我的程序运行时,它的输出都是不同的。

请有人解释为什么我

"""
    Author: Luke Spademan
    Calculates answer to project euler problem id19
    https://projecteuler.net/problem=19
"""


def calculate():
    ans = 0
    months = {
        "jan": 31,
        "feb": 28,
        "mar": 31,
        "apr": 30,
        "may": 31,
        "jun": 30,
        "jul": 31,
        "aug": 31,
        "sep": 30,
        "oct": 31,
        "nov": 30,
        "dec": 31,
    }
    i = 1
    for year in range(1901, 2001):
        for month in months:
            months["feb"] = 28
            if year % 4 == 0 and not (year % 100 == 0 and year % 400 != 0):
                months["feb"] = 29
            if i % 7 == 0:
                ans += 1
            i += months[month]
    return ans

if __name__ == "__main__":
    answer = calculate()
    print(answer)

2 个答案:

答案 0 :(得分:6)

问题是计算的结果取决于months迭代的顺序。从Python 3.3开始,字符串哈希默认是随机化的,这意味着此顺序不是确定性的(until Python 3.6)。您可以阅读有关如何确定地运行此程序的here,尽管我认为您的目的是始终以预定义顺序迭代months,在这种情况下,它应该是listOrderedDict

答案 1 :(得分:0)

使用日期时间

在您迷失有关dictOrderedDict的实施详细信息之前,您可以使用datetime来了解答案应该是什么:

>>> from datetime import date
>>> sum(1 for month in range(1,13) for year in range(1901, 2001) if date(year, month, 1).weekday() == 6)
171

使用元组列表

请注意,即使使用Python 3.6或Python2 + OrderedDict,您的代码也会返回172。

您的星期日测试写为i % 7 == 0。这意味着你的循环中的第一天(1901年1月1日),tuesday,应该用i = 2进行初始化。

为避免未排序的dicts出现任何问题,您只需使用元组列表:

def calculate():
    ans = 0
    months = [('jan', 31), ('feb', 28), ('mar', 31), ('apr', 30), ('may', 31), ('jun', 30), ('jul', 31), ('aug', 31), ('sep', 30), ('oct', 31), ('nov', 30), ('dec', 31)]
    i = 2
    for year in range(1901, 2001):
        for month_name, days in months:
            if month_name == "feb":
              if year % 4 == 0 and not (year % 100 == 0 and year % 400 != 0):
                  days = 29
              else:
                  days = 28
            if i % 7 == 0:
                ans += 1
            i += days
    return ans

if __name__ == "__main__":
    answer = calculate()
    print(answer)

此代码返回任何Python版本的171