gpt4 book ai didi

python - 生成大量唯一的随机 float32 数字

转载 作者:太空狗 更新时间:2023-10-29 21:55:19 24 4
gpt4 key购买 nike

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

我可以在 python 中使用 double 字并将它们插入到 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 永远不会结束),而且我无法使用 生成单精度数字随机。我研究过 numpy 但生成器的工作方式与我理解的相同。我怎样才能在二进制文件中获得 370914252(这是我最大的测试用例)唯一的 float32,即使它们不是随机的,我认为打乱顺序就足够了..

最佳答案

最好的办法是生成随机的 32 位整数,然后将它们转换为 float 。在生成数字时,您需要拒绝无穷大和 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))

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

关于python - 生成大量唯一的随机 float32 数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20101789/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com