【发布时间】:2020-03-07 06:08:34
【问题描述】:
我正在尝试创建一个国际象棋引擎。有人告诉我,我们可以通过散列单个棋子键来为任何国际象棋位置生成唯一键。它就像特定方格上的特定棋子具有唯一的 64 位密钥。然后我们应该对位置中存在的每个片段的片段键进行异或。
忽略关于国际象棋位置的castling和en Passant square信息,这是我被告知生成位置键的方式(用C语言)
typedef unsigned long long U64;
#define RAND_64 ( (U64) rand() + \
(U64) rand() << 15 + \
(U64) rand() << 31 + \
(U64) rand() << 45 \
)
这是从上面声明的 RAND 64 生成片段密钥的方式...
int index, index2;
U64 pieceKeys[12][64]; // For 12 pieces on every possible square.
for(index = 0; index<12; index++) {
for(index2 = 0; index2<64; index2++) {
pieceKeys[index][index2] = RAND_64;
}
}
我的问题是,这里不可能为 2 块上的 2 块生成相同的块密钥。如果发生这种情况,那么当我们通过对片段键进行 XOR 来创建位置键时就会产生歧义。
我说的对吗?如果是这样,我该如何解决这个潜在的问题?
【问题讨论】:
-
这里没有实际的执行代码,除了数组数组的声明。也许您可以展示 RAND_64 如何在您编写的代码中用作问题的一部分。
-
好的,我也会添加那部分
-
Chess 上有一个与此相关的问题(这可能是比这里更好的地方):engines - How to generate hash keys for chess positions。
-
我只是想在那个论坛上提问。但我发现像 C 语言这样的东西没有标签。散列等。所以我认为这可能是更好的地方。
-
由于您使用(三个)rand() 填充 Zobrist 表,因此两个条目将获得相同的值并非不可能(但极不可能)。但是,您可以测试这些重复项,并从 rand() 中为每个碰巧具有重复值的单元格提取一组新值。