Я играл с NumPy и Pillow и столкнулся с интересным результатом, который явно демонстрирует паттерн в результатах NumPy random.random()
.

Здесь приведен пример полного кода для генерации и сохранения 100 таких изображений (с начальным числом 0), выше приведены первые четыре изображения, сгенерированные этим кодом.
import numpy as np
from PIL import Image
np.random.seed(0)
img_arrays = np.random.random((100, 256, 256, 3)) * 255
for i, img_array in enumerate(img_arrays):
img = Image.fromarray(img_array, "RGB")
img.save("{}.png".format(i))
Выше приведены четыре разных изображения, созданные с использованием PIL.Image.fromarray()
на четырех разных массивах NumPy, созданных с использованием numpy.random.random((256, 256, 3)) * 255
для генерации сетки RGB 256 на 256 значений в четырех разных экземплярах Python (то же самое происходит и в том же экземпляре) .
Я заметил, что это происходит только (в моем ограниченном тестировании), когда ширина и высота изображения являются степенью двойки, я не уверен, как это интерпретировать.
Хотя это может быть трудно увидеть из-за сглаживания браузера (вы можете загружать изображения и просматривать их в средствах просмотра изображений без сглаживания), в каждом восьмом столбце есть четкие пурпурно-коричневые столбцы пикселей, начиная с 3-я колонка каждого изображения. Чтобы убедиться, я проверил это на 100 различных изображениях, и все они следовали этому шаблону.
Что здесь происходит? Я предполагаю, что подобные шаблоны являются причиной того, что люди всегда говорят, что используют криптографически безопасные генераторы случайных чисел, когда требуется истинная случайность, но есть ли конкретное объяснение, почему это происходит, в частности?