Это заставляет меня думать о фракталах - следуя границе в множестве джулии или что-то в этом роде.
Если N равно 1000, используйте фрактальную битовую карту 2 ^ 500 x 2 ^ 500 (очевидно, не генерируйте ее заранее - вы можете получить каждый пиксель по требованию, и большинство не понадобится). Каждое перемещение пикселя на один пиксель вверх, вниз, влево или вправо следует за границей между пикселями, как простой алгоритм трассировки растрового изображения. До тех пор, пока вы начинаете с края растрового изображения, вы должны рано или поздно возвращаться к краю растрового изображения - после определенной «цветовой» границы всегда должна получаться замкнутая кривая без самопересечений, если вы смотрите на неограниченные версия этого фрактала.
Оси x и y растрового изображения, разумеется, потребуют координат с серым кодом - немного похоже на карты Карно увеличенного размера. Каждый шаг в трассировке (один пиксель вверх, вниз, влево или вправо) приравнивается к однобитовому изменению в одной координате растрового изображения и, следовательно, в одном бите результирующих значений при случайном обходе.
EDIT
Я только что понял, что есть проблема. Чем более морщинистая граница, тем больше вероятность, что вы в трассировке попадете в точку, где у вас есть выбор направлений, например ...
* | .
---+---
. | *
В каком бы направлении вы не вошли в эту точку, у вас есть три варианта выхода. Выберите неправильный из двух других, и вы можете вернуться к этой точке, поэтому это возможная точка самопересекаения и возможное повторение. Вы можете исключить выбор продолжения в том же направлении - в зависимости от того, в каком направлении вы будете поворачивать, должны сохраняться одинаковые цвета границ слева и справа от вашего пути границы, но при этом остается выбор двух направлений.
I думаю, проблему можно устранить, сделав так, чтобы во фрактале было по крайней мере три цвета, и всегда оставляя один и тот же цвет одной конкретной стороне (относительно направления трассировки) границы. Однако может существовать условие «пока фрактал не слишком морщинистый».
Последнее исправление - вести учет точек, в которых этот выбор был доступен. Если вы вернетесь к той же точке, вернитесь назад и возьмите другой вариант.