Как стать автором
Обновить

Комментарии 5

Интересно, а нельзя было достичь того же эффекта суммированием числа не имеющего общих делителей с размером видеобуфера? Или всё равно паттерны будут видны?
НЛО прилетело и опубликовало эту надпись здесь
идея псевдослучайной заливки экрана с наименьшими коллизиями потрясает

Есть идея посильнее, без коллизий:
N, a, b, i = 64000, 34781, 33937, 0
screen = [True] * N
for _ in range(N):
    i = (i * a + b) % N
    if screen[i]:
        screen[i] = False
    else:
        print(f'опс, второй раз в ту же точку')
        break
else:
    print(f'все {N} точек закрашены за {N} ходов')
что там с псевдослучайностью?
image

Откуда взялись a и b? Подобрал, таких пар много.

рендеринг
from PIL import Image

n, N, a, b, i = 200, 64000, 34781, 33937, 0
img = Image.new('1', (320, 200), color='black')
for step in range(n + 1):  # 201 кадр анимации
    for _ in range(N // n):
        i = (i * a + b) % N
        img.putpixel(divmod(i, 200), 1)
    img.save(f'{step:>03}.gif', 'gif')


Вы не уловили контекста. Wolfenstein 3D игра для тех компьютеров, в памяти которых хранить такой кусок данных тяжеловато.


In [2]: screen.__sizeof__()
Out[2]: 512040

При том что 640кб хватит всем, да.
В статье 2017 года это отдельно оговаривается.

Смотрите, что я написал:

Это код, который демонстрирует, что коллизий эта формула не создаёт и все точки заполняются. Мне на него хватило памяти, вам, слава богу, тоже.

В Wolfenstein 3D точки выводятся прямо в фреймбуфер, а я вот вывел в переменную screen. Ну просто чтобы вывести куда-то, убедиться, что коллизий нет, ну и вас убедить. Не убедил?

А вот если бы я тоже выводил в фреймбуфер игры Wolfenstein 3D, это бы мне ничего по памяти не стоило, кроме фреймбуфера, который всё равно нужен, и он есть, и вот он:
 push    0A000h     ; начало видеобуфера
А контекст, так он прямо в первых двух строчках комента. Не читали?
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории