Random 从随机字节生成随机浮点,无需位旋转

Random 从随机字节生成随机浮点,无需位旋转,random,floating-point,Random,Floating Point,假设我有一个足够好的随机字节值(tm)流,是否有数学方法将这些值转换为不需要知道浮点内部格式的(0

假设我有一个足够好的随机字节值(tm)流,是否有数学方法将这些值转换为不需要知道浮点内部格式的(0 我在寻找这样的东西:

  • 不需要按位操作(在浮点上),并且
  • 是一个迭代过程,我们可以知道它在n次迭代后会给出一个很好的值,其中n是输出精度的函数
  • 一种可用于任何精度浮点运算的通用过程,只需更改迭代次数即可,即消耗更多的输入字节来生成一个双精度浮点运算
简单的解决方案是从几个字节中构建一个大整数,然后简单地转换为浮点除以2^n,但我不知道如何在不破坏分布的情况下实现这一点

另一个想法是这样的(伪代码):


这似乎应该行得通,但我不知道如何证明:)

正如塞韦林·帕帕德乌斯所说,为什么不做类似的事情呢

const double factor = 2.32830643653869628906e-10;    // 2^(-32)
unsigned int accumulator = 0;
for (int i = 0; i != 4; ++i)
{
    accumulator <<= 8;
    accumulator |= getRandomByte();
}
double r = factor * accumulator;
const double factor=2.32830643653869628906e-10;//2^(-32)
无符号整数累加器=0;
对于(int i=0;i!=4;++i)
{

好的,我想我已经有你需要的了

让我们考虑以下范围内的采样浮点(0…1)。256是2 ^ 8,相当于下一个字节移位。

b0*256*256*256 + b1*256*256 + b2*256 + b3
要获得[0…1)范围内的数字,必须将其除以256*256*256*256,因此

f = b0/256 + b1/(256*256) + b2/(256*256*256) + b3/(256*256*256*256)
反过来,它等价于多项式计算的霍纳格式

f = (1/256)*(b0 + (1/256)*(b1 + (1/256)*(b2 + (1/256)*b3)))

反过来,这和你写的差不多(对于某些抽象N)

你想要达到什么分布?在[0,1]中是一致的?还是你想要在每个二进制码中产生相同数量的随机数?能够在[0,1]中命中每个可能的浮点数有多重要?“另一个想法”是如何实现的不同于构建一个大整数并对其进行除法?在我看来,当你组合字节时,你只是在逐段进行二次除法运算。你说的“弄乱分布”是什么意思?比如说,将4个字节组合成4个字节的实体似乎是通过“弄乱分布”来获得所谓的Generator的可靠方法我的意思是,当m和n不同时,n位整数值的均匀分布将映射为m位浮点的不均匀分布,这仅仅是因为某些目标值在源空间中的表示过度/不足。
f = (1/256)*(b0 + (1/256)*(b1 + (1/256)*(b2 + (1/256)*b3)))