Я играл с 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
для генерации 256-х мерной сетки RGB-значений в четырех разные экземпляры Python (то же самое происходит и в одном экземпляре).
Я заметил, что это происходит только в моем ограниченном тестировании, когда ширина и высота изображения равны двум, я не уверен, как это интерпретировать.
Хотя это может быть трудно увидеть из-за сглаживания браузера (вы можете загружать изображения и просматривать их в средствах просмотра изображений без сглаживания), есть четкие фиолетово-коричневые столбцы пикселей, каждая восьмая колонка, начиная с третьего столбца каждый изображение. Чтобы убедиться, я проверил это на 100 различных изображениях, и все они следовали этому шаблону.
Что здесь происходит? Я предполагаю, что такие шаблоны являются причиной того, что люди всегда говорят, что используют криптографически безопасные генераторы случайных чисел, когда требуется истинная случайность, но есть ли конкретное объяснение, почему это происходит в частности?