我现在要面对的问题是我有一定数量的字节数组,它们的大小不同。我想将它们放入一个比所有其他字节数组都大得多的单个字节数组中,以便在没有放入任何字节的大字节数组中出现空隙。
字节数组随机分布在大字节数组上,但是任何字节数组都不会与已经放置在其中的另一个字节数组发生冲突。 为什么有这种高效的随机分布方式而不会发生冲突?
答案 0 :(得分:0)
具有以下功能:
from random import randint, shuffle
import itertools
import operator
def random_distribution(image, files):
shuffle(files)
available_size = len(image) - sum(map(len, files))
gap_positions = sorted([randint(0, available_size) for i in range(len(files))])
gap_deltas = itertools.starmap(operator.sub, zip(gap_positions, [0] + gap_positions))
position = 0
for file, gap_delta in zip(files, gap_deltas):
position += gap_delta
image[position : position + len(file)] = file
position += len(file)
return image
我们将10个字节的3个文件随机分发到20个字节的图像中:
>>> files = ['abc', '1234', 'ABCDE']
>>> for i in range(10):
... print(random_distribution(bytearray(20), files).replace('\x00', '.'))
...
.abc.1234...ABCDE...
..ABCDE.abc....1234.
abcABCDE......1234..
..1234...ABCDE...abc
..1234.....abc.ABCDE
...abc.1234..ABCDE..
abc...ABCDE....1234.
.ABCDE..abc1234.....
....ABCDE..1234.abc.
1234..ABCDE.abc.....
想法是首先通过从图像大小中减去文件的总大小来计算可用空间,然后通过选择可用空间内的随机位置(我称其为“间隙位置”)来随机分割可用空间”)。间隙位置之间的增量将成为文件之间的间隙,因此,当我们将文件复制到图像中时,在将文件放置在最后一个文件的末尾之前,我们跳过了相应的间隙增量。