C中迷宫生成算法中随机性的微妙缺乏

Subtle Lack of Randomness in Maze Generation Algorithm in C

这与我只能推测的是某人用于生成随机迷宫的代码中的缺陷有关。 The code 有点长,但大部分是注释掉的选项 and/or 与随机化无关。

我从 link dllu 中得到了 2001x2001 迷宫并保存为 png here. From that, I have created this。为了得到蓝色图案,我开始从迷宫的左下角开始填充死胡同。根据他使用的回溯算法,那是迷宫开始生成的点:所以如果你沿着由此产生的死胡同的踪迹前进,你就可以系统地填满迷宫那一侧的所有死胡同。换句话说,中央蓝色块表示从左下角开始的总可访问区域,直到 2678 x 1086 的唯一边界像素。

但是有一些立即异常的东西,因为蓝色 "fractal" 似乎在重复自己。的确,by overlaying one part of the fractal, rotated and mirrored, you can see there is an exact correspondence of shape. Another anomaly from this overlay maps part of one of the continents onto another, but strangely only a sliver of the landmass this time。显然,这些并不是唯一的自动对应。

但除了死胡同的形状外,当你放大时,墙壁的实际图案会重复。最奇怪的是,重复并不准确,但可能只有 50-60%墙壁对应。区域的缩放和对比样本:

长话短说,代码中是什么导致了这种模糊的随机性缺乏?

标准库函数 rand 的实现通常很糟糕,而您的代码正在执行 rand()%4 这会加剧问题,因为糟糕的实现往往 更少 低位的随机性。尝试用不同的随机数生成器替换 rand

Anonymous 正确地指出了 rand 的实现不佳并且它的低位熵很差。

为了缓解这个问题,您可以使用更强大的伪随机数生成器(例如适用于加密方法的伪随机数生成器);然而,更高的随机性往往会导致随机数生成函数的时间更长。

我最初会尝试从您的随机生成器中提取一些高级位。用一个不太完美的随机生成器来改进结果可能就足够了。由于它们是从结果的不同区域提取的,并转移到您需要的 0-3 值,因此它们的分布应该不同(希望更随机)