当前位置: 首页 > 知识库问答 >
问题:

在Python中组装Random.random()的浮点数

郝修为
2023-03-14

我试图从python标准库中实现我自己版本的Random类。我可以生成随机位,并实现了getrandbits(n)函数。但超类不使用此函数计算从random()返回的浮点值。因此,我必须自己实施:

def random(self):
    exp = 0x3FF0000000000000
    mant = self.getrandbits(52)
    return struct.unpack("d", struct.pack("q", exp^mant))[0]-1.0

我使用的符号是0(正),指数是1023(2^0=1)和随机尾数。所以我从[1.0,2.0]中得到一个数字。random()函数必须返回[0.0,1.0]中的一个数字,所以我在返回之前先减去1.0。因为我不是浮点数方面的专家,所以我不确定这样做是否正确。我是不是会因为减去而失去精度?我可以从随机位中构建数字,使其处于正确的位置吗[0.0,1.0)没有减法?

共有1个答案

栾鸣
2023-03-14

您的实现是好的:假设getrandbit本身是足够随机的,您的实现将为0生成表单n/2^52的每个数字

Python的random()。getrandbits(53)/2**53 效果类似,只是输出的分布现在是原来的两倍:您可以得到n/2^53for0的每一个数字

这两者都不是完美的:在[0.0,1.0)范围内大约有2^62不同的IEEE 754 binary64浮点数,并且您的实现只能生成2^52不同的输出,因此大多数浮点数永远不会由上述实现中的任一种生成。更好的随机()实现可以生成范围[0.0,1.0]中的每个浮点数x,其概率等于[0.0,1.0)的子区间的长度x下的某种形式的轮到最近。然而,这样的实现要复杂得多(尽管不是特别难以实现),很少有应用程序会从更大的输出集中受益。正如蟒蛇禅宗所说:“实用战胜纯洁。”

编辑:为了说明上面的最后一段,这里有一些代码。根据上述描述,uniform函数使用getrandbits[0,1]上生成均匀分布的浮点。

"""                                                                                                                                                                                                                                         
High quality uniform random variable on [0, 1].                                                                                                                                                                                             

Simulates round(X) where X is a real random variable uniformly distributed on                                                                                                                                                               
the interval [0, 1] and round is the usual round-to-nearest rounding function                                                                                                                                                               
from real numbers to floating-point.                                                                                                                                                                                                        

"""
from __future__ import division
import random

precision = 53
emin = -1021

def random_significand():
    return (random.getrandbits(precision) + 1) // 2 / (2**precision)

def uniform():
    for i in xrange(1 - emin):
        if random.getrandbits(1):
            return (random_significand() + 0.5) / 2**i
    # Subnormal                                                                                                                                                                                                                             
    return random_significand() / 2**i

 类似资料:
  • 问题内容: 谁能解释模运算符在Python中如何工作?我不明白为什么。 问题答案: 其实,这是不正确的3.5 % 0.1是0.1。你可以很容易地测试一下: 实际上,在大多数系统上是。但是,在某些版本的Python上是: 现在,你可能想知道为什么是而不是。这是由于通常的浮点舍入问题。如果你还没有阅读每位计算机科学家应该知道的有关浮点运算的知识,那么你应该-至少是对此问题的简要概述。 还需要注意的是3

  • 问题内容: 我很困惑为什么在这种情况下python为什么要添加一些额外的十进制数,请帮助解释 问题答案: 浮点数是一个近似值,它们不能精确存储十进制数。因为它们试图仅用64位表示很大范围的数字,所以它们必须在某种程度上近似。 意识到这一点非常重要,因为它会导致一些怪异的副作用。例如,你可能会非常合理认为,十批的总和会。尽管这似乎合乎逻辑,但在浮点数方面也是错误的: 您可能会认为。浮点世界再次不同意

  • 问题内容: 我正在从文件中读取数据,对其进行修改并将其写入另一个文件。新文件将被另一个程序读取,因此保持准确的格式至关重要 例如,输入文件中的数字之一是: 我的脚本对列应用了一些数学运算,应该返回 但是目前返回的是 我怎么会写一个浮动例如,作为一个文件? 问题答案: 将其格式化为6位小数: 演示: 该函数按照给定的格式说明将值转换为字符串。

  • 我正在寻找Java的的Python等价物。 我找到了这个python:获取和操纵(作为整数)浮点的位模式,但是有没有人知道一种不那么复杂的方法呢?

  • 我正在从一个文件中读取数据,修改它并将其写入另一个文件。新文件将由另一个程序读取,因此保留精确的格式至关重要 例如,我输入文件中的一个数字是: 我的脚本对列应用了一些数学运算,应该会返回 但目前返回的是 我如何将浮点值(例如)写入一个文件中?

  • 对于精度很重要的用例,推荐使用Python的本机浮点实现还是十进制实现? 我认为这个问题很容易回答:如果累积误差具有重要意义,例如可能在计算轨道轨迹等方面,那么一个精确的表示可能更有意义。 null

  • 问题内容: 是否有比浮点精度更好的数据类型? 问题答案: 小数数据类型 与基于硬件的二进制浮点数不同,十进制模块具有用户可更改的精度(默认为28位),可以与给定问题所需的精度一样大。 如果您对性能问题感到困扰,请查看GMPY

  • 本文向大家介绍Python中关于浮点数的冷知识,包括了Python中关于浮点数的冷知识的使用技巧和注意事项,需要的朋友参考一下 本周的PyCoder's Weekly 上分享了一篇小文章,它里面提到的冷知识很有意思,我稍作补充,分享给大家。 它提到的部分问题,读者们可以先思考下: 若两个元组相等,即 a==b 且 a is b,那么相同索引的元素(如 a[0] 、b[0])是否必然相等呢? 若两个