Random 从随机字节生成随机浮点,无需位旋转
假设我有一个足够好的随机字节值(tm)流,是否有数学方法将这些值转换为不需要知道浮点内部格式的(0Random 从随机字节生成随机浮点,无需位旋转,random,floating-point,Random,Floating Point,假设我有一个足够好的随机字节值(tm)流,是否有数学方法将这些值转换为不需要知道浮点内部格式的(0
- 不需要按位操作(在浮点上),并且
- 是一个迭代过程,我们可以知道它在n次迭代后会给出一个很好的值,其中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)))