我需要一个非常快的伪随机数发生器的一个项目,我一直在工作.到目前为止,我已经实现了xorshift算法,可以产生伪随机u64.但是,我需要将这些u64转换为0和1之间的浮点值.
由于某些原因,我无法接近我想要的行为;这让我感到困惑,因为我使用了与Found here完全相同的方法.尽管我看不到实现有什么不同,但我得到了不同的结果.
let seeds: [u64; 64] = core::array::from_fn(|i| i as u64);
let bitshift12 = u64x64::splat(12);
let bitshift25 = u64x64::splat(25);
let bitshift27 = u64x64::splat(27);
let bitshift52 = u64x64::splat(52);
let mut random_states = Simd::from(seeds);
random_states ^= random_states >> bitshift12;
random_states ^= random_states << bitshift25;
random_states ^= random_states >> bitshift27;
random_states = random_states | ((u64x64::splat(1023) + u64x64::splat(0)) << bitshift52);
let mut generated = Simd::<f64, 64>::from_bits(random_states);
println!("{:?}", generated);
输出:
[1.0, 1.0000000074505808, 1.0000000149011616, 1.0000000223517425, 1.0000000298023235, 1.0000000372529039, ...]
显然,我没有正确地做一些事情,因为最后几个小数是根据需要"随机"的.为什么我不能正确地将这些向上移动?
如果有人指出我的错误,我将不胜感激.