生成大量独特的随机float32数字

我需要生成一个二进制文件,其中只包含唯一的随机数,具有单一精度。 然后计算该文件的熵,并将其与其他数据集的熵结合使用以计算比率entropy_file / entropy_randUnique。 该值被命名为“随机性”。

我可以用双精度数字在python中执行此操作,然后将它们插入到set() ,像这样使用struct.pack

    numbers = set()
    while len(numbers) < size:
        numbers.add(struct.pack(precision,random.random()))
    for num in numbers:
        file.write(num)

但是当我更改为单精度时,我不能只更改pack方法(这将产生大量相同的数字,而while将永远不会结束),并且我无法用random生成单精度数字。 我已经看过numpy但发电机的工作方式与我所了解的相同。 我怎么能得到一个二进制文件中的370914252(这是我最大的测试用例)独特的float32,即使它们不是随机的,我认为洗牌序列就足够了。


你最好的选择是生成随机的32位整数,然后将它们转换为浮点。 在生成数字时,您需要拒绝无限和NAN的位表示。

您可以从整数值而不是浮点值生成您的set ,然后在输出上进行转换。 您可以使用位图来检测已使用的整数值,而不是使用一组值。 这更可能适合记忆,尤其是考虑到您指出的最大样本量。

def random_unique_floats(n):
    used = bytearray(0 for i in xrange(2**32 // 8))
    count = 0
    while count < n:
        bits = random.getrandbits(32)
        value = struct.unpack('f', struct.pack('I', bits))[0]
        if not math.isinf(value) and not math.isnan(value):
            index = bits // 8
            mask = 0x01 << (bits & 0x07)
            if used[index] & mask == 0:
                yield value
                used[index] |= mask
                count += 1

for num in random_unique_floats(size):
    file.write(struct.pack('f', num))

请注意,随着样本数量接近可能的浮点值数量,运行时间将呈指数级增长。

链接地址: http://www.djcxy.com/p/17387.html

上一篇: Generate large number of unique random float32 numbers

下一篇: iOS Chunked Upload