PRNG背后的理论是什么?
What is the theory behind this PRNG?
__forceinline static int Random()
{
int x = 214013, y = 2531011;
seed = (x * seed + y);
return ((seed >> 16) & 0x7FFF) - 0x3FFF;
}
上面的代码返回具有良好均匀分布的PRNG。
现在将x改为x + 1 -生成的序列不能再称为PRNG了
那么PRNG背后的理论是什么呢?" x和y是经过精心挑选的"但它们是如何被挑选出来的呢?
这看起来像一个线性同余生成器。当乘数x
可以被模数减1的所有质因数整除时(这里是0x3FFFFFFFF
,由于返回语句中的数学运算,它有点隐藏),LCG更好。
32位LCG,丢弃最低16位。我怀疑这个生成器是否适合有趣的用途。对于简单的游戏,这应该足够了。
你的具体问题由我发布的链接回答:生成器实现这个特定的y的完整周期当且仅当x - 1是4的倍数(在维基百科的符号中,a是x, c是y, m是2^31)。
因此,当x为偶数时,生成器不是最优的。
这是一个线性全同生成器。也应该有一个模;的经典公式为:
seed = (a * seed + b) % m;
在这种情况下,m
只是2^n,其中n是seed
的位数(可能是unsigned类型,因为模运算是需要)。关于如何选择a
, b
和m
;一般按参考文档(随机数)生成器:好的很难找到, Park and Miller, ccm, 10月。1988), m
应为素数,b
通常为0;这Generator违反了这两条规则。(违反第一种倾向于使低阶位非常非随机,这就解释了为什么结果转移。)
据我所知,唯一能保证a
和m
选择的方法好的是做大量的统计检验,虽然有办法找出一些不好的。对于初学者来说,a
和m
应该没有常见的因素。(在最好的生成器中,两者通常都是质数。)这里,m
是2的幂,x
加1能被2整除因此,您或多或少可以保证生成的生成器不会很好。
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- C++避免重复声明的语法是什么
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- C++从另一个类访问公共静态向量的正确方法是什么
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- C++中名称篡改的目的是什么
- 在 c++ 中拥有一组结构的正确方法是什么?
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 是什么阻止DOMTimerCoordinator::NextID进入无休止的循环
- 派生类销毁的最佳实践是什么
- 这个语法std::class<>{}(arg1, arg2) 在C++中是什么意思?
- 通过JNI传递数据数组的最快方法是什么
- "using namespace std;"在C++的作用是什么?
- 在两台机器之间进行时间戳的最佳c++chrono函数是什么
- 文件系统:复制功能的速度秘诀是什么
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 使用QQuickFramebufferObject时同步数据的最佳方式是什么
- 直接索引访问与"high"内存使用量相比的理论影响是什么? "shifted"使用"low"内存使用情况的索引访问?
- PRNG背后的理论是什么?