Sam*_*gee 7 python floating-point numpy floating-point-precision floating-point-conversion
我需要生成一个二进制文件,其中只包含唯一的随机数,具有单精度.然后,目的是计算该文件的熵并将其与其他数据集熵一起使用以计算比率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)
Run Code Online (Sandbox Code Playgroud)
但是当我改为单精度时,我不能只改变包方法(这会产生很多相同的数字而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))
Run Code Online (Sandbox Code Playgroud)
请注意,当样本数量接近可能的浮点值数量时,运行时间将呈指数增长。
| 归档时间: |
|
| 查看次数: |
286 次 |
| 最近记录: |