在Python中创建数字配方随机数生成器

2024-06-27 02:41:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我想从U[0,1]分布生成随机数。我试图根据数字配方第7.1章重新创建随机数生成器。不幸的是,我的C++并不是特别强,所以我在代码后面有一些问题!我想知道是否有人能帮助我澄清我对这里发生的事情的真正理解。在C++中,代码提供为:

struct Ran {
    Ullong u, v, w;
    Ran(Ullong j) : v(4101842887655102017LL), w(1) {
        u = j ^ v; int64();
        v = u; int64();
        w = v; int64();
    }
    inline Ullong int64() {
        u = u * 2862933555777941757LL + 7046029254386353087LL;
        v ^= v >> 17; v ^= v << 31; v ^= v >> 8;
        w = 4294957665U*(w & 0xffffffff) + (w >> 32);
        Ullong x = u ^ (u << 21); x ^= x >> 35; x ^= x << 4;
        return (x + v) ^ w;
    }
    inline Doub doub() { return 5.42101086242752217E-20 * int64(); }
    inline Uint int32() { return (Uint)int64(); }
};

我的理解是:

Ran(Ullong j) : v(4101842887655102017LL), w(1) {
        u = j ^ v; int64();
        v = u; int64();
        w = v; int64();
    }

这是我们的初始化j这是我们的种子v被设置为一个非常大的素数^是一个按位异或运算符,因此当我们洗牌uvw时,这提供了我们的第一级随机性

除此之外,我开始感到困惑

inline Ullong int64() {
        u = u * 2862933555777941757LL + 7046029254386353087LL;
        v ^= v >> 17; v ^= v << 31; v ^= v >> 8;
        w = 4294957665U*(w & 0xffffffff) + (w >> 32);
        Ullong x = u ^ (u << 21); x ^= x >> 35; x ^= x << 4;
        return (x + v) ^ w;
    }

特别是,我不明白是什么

    v ^= v >> 17;

是的。我认为这是将v向右移位17位,然后对原始v执行异或,然后将此输出保存为v

我也不明白

w = 4294957665U*(w & 0xffffffff) + (w >> 32);

一点也不。快速搜索here表明0xffffffff要么是-1,要么是一个大数字,但我仍然不太明白这行在做什么(除了一些位操作)

最后,我相信这句话:

inline Doub doub() { return 5.42101086242752217E-20 * int64(); }

正在返回0和1之间的随机数

如果有人能纠正、澄清或确认我这里的内容,我将不胜感激


Tags: 代码return配方inline数字事情种子struct
1条回答
网友
1楼 · 发布于 2024-06-27 02:41:05

感谢谢夫猫,所有超级有用的答案。我发现了一些在Python中似乎有效的东西,但我也采纳了您的建议,暂时不太冒险地生成随机数

相关问题 更多 >