【问题标题】:Why is this function not giving consistent output?为什么这个函数没有给出一致的输出?
【发布时间】:2014-09-09 20:50:32
【问题描述】:

我制作井字游戏 AI 只是为了好玩。我创建了一个后继函数,它返回一个字典,其中开始状态为键,所有紧随其后的状态为值。

据我所知,该函数运行良好(尽管我仍然需要删除对称状态),但由于某种原因,每次我运行该函数时,后继状态的元组都处于不同的顺序。我得到相同的值,但它们被打乱了。

from itertools import *

def successors(state):
    vars = [0]*state.count(0)
    vars[0] = 'x'
    vars[1] = 'o'
    vars = list(set(permutations(vars)))
    state = tuple([state[i:i+3] for i in range(0, len(state), 3)])
    states = []
    for var in vars:
        new_board = []
        for row in state:
            new_row = []
            for tile in row:
                if tile != 0:
                    new_row.append(tile)
                else:
                    new_row.append(var[0])
                    var = var[1:]
            new_board.append(tuple(new_row))
        states.append(tuple(new_board))
    return {state:states}


board = (0,0,0,
         0,0,0,
         0,0,0)

print(successors(board))

是否存在未重置的变量?

【问题讨论】:

  • 每次运行函数?还是每次运行程序?我打赌是后者——我猜你正在运行 python2.7 并启用了哈希随机化。
  • @mgilson:为什么是 2.7? 3.4 has SipHash enabled by default.
  • @user2357112 -- 出于某种原因,我认为它在 python2.7 和 3.3(分别)默认情况下开始启用。如果我注意到 OP 使用 print 作为函数,我就不会那么具体了:-/
  • 3.3 has randomization enabled by default too, though not as good。 (我不确定该更改何时生效。我花了一些时间来查找它。)据我所知,没有 2.x 版本默认启用它。
  • A set 是无序的,所以当你说 list(set(permutations(vars))) 时,你基本上把所有关于有序的假设都抛到了窗外。

标签: python dictionary set


【解决方案1】:

这可能是因为你这样做了:

vars = list(set(permutations(vars)))

这里的顺序是任意的,由于哈希随机化,每次运行可能会有所不同。要禁用它,请将PYTHONHASHSEED 环境变量设置为一个常量值——例如0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 2022-11-27
    • 2018-10-28
    • 1970-01-01
    • 2023-02-05
    • 2022-11-30
    相关资源
    最近更新 更多