【问题标题】:Generate large number of unique random float32 numbers生成大量唯一的随机 float32 数字
【发布时间】:2013-11-20 16:44:27
【问题描述】:

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

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

    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,即使它们不是随机的,我认为洗牌序列就足够了..

【问题讨论】:

    标签: python numpy floating-point floating-point-precision floating-point-conversion


    【解决方案1】:

    最好的办法是生成随机的 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))
    

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

    【讨论】:

    • 我从未使用过yield,我正在尝试这个for num in random_unique_floats(size): file.write(num),我不确定它是否正确。它给出了一个错误“used = bytearray(0 for i in range(2**32 / 8)) TypeError: 'float' object cannot be compiled as an integer” 编辑:我已将 xrange 更改为 range,因为我使用python3
    • @SamGamgee,那么你需要使用2**32 // 8来获得整数除法。我会编辑答案。我将保留xrange 原样,所以答案仍然适用于 Python 2。
    • 好吧,这是有道理的(也感谢你教我 // 除法:))我现在正在运行程序,样本越来越多,到目前为止它似乎工作正常!很快就会标记为答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多