C语言中迷宫生成算法的细微缺乏随机性

时间:2015-03-24 02:50:08

标签: c algorithm debugging random maze

这涉及我只能猜测的是用于生成随机迷宫的某人代码中的缺陷。 The code有点长,但大多数都是注释掉的选项和/或没有特别关注随机化。

我从链接dllu中获得了2001x2001迷宫并保存为png here。从那以后,我创建了this。为了获得蓝色图案,我开始从迷宫的左下角开始填充死角。根据他使用的回溯算法,这就是迷宫开始产生的点:所以如果你跟踪由此产生的死角的踪迹,你可以系统地填充迷宫那一侧的所有死角。换句话说,中央蓝色质量代表从左下角开始到2678 x 1086的唯一前沿像素的总可访问区域。

但是有些东西立即异常,因为蓝色的“分形”似乎在重演。的确,by overlaying one part of the fractal, rotated and mirrored,你可以看到形状的确切对应。此叠加层中的另一个异常将一个大陆的一部分映射到另一个大陆but strangely only a sliver of the landmass this time。显然这些并不是唯一的自动对应。

但是除了死端组件的形状之外,当放大时,墙壁的实际图案会重复出现。最奇怪的是,重复并不精确,但只有50-60%的墙壁对应。放大和区域化的样本:

Bright regions indicate isomorphism, dark regions indicate lack of isomorphism

长问题很简单,代码中是什么导致这种模糊的缺乏随机性?

2 个答案:

答案 0 :(得分:6)

标准库函数rand通常可怕地实现,并且您的代码正在执行rand()%4,这会加剧问题,因为较差的实现往往在较低位中具有较少的随机性。尝试用不同的随机数生成器替换rand

答案 1 :(得分:3)

Anonymous已经正确地表明rand的实现很差,并且它的低位熵很差。

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

我最初会尝试从随机生成器中提取一些高级位。使用不完全随机的发生器来改善结果可能就足够了。当它们从结果的不同区域拉出,并转移到你需要的0-3值时,它们的分布应该是不同的(希望有点随机)