最近的一个项目让我想起一个非常简单的方式产生伪随机数创建雨滴的行为。我发现,假如我们有一个随机初始化的无符号32位种子N可以循环通过伪随机数(C)只使用14个字符的乘法表:n*=0x9e3779b1;
每次应用此操作时,n将包含一个新的伪随机数。很神秘的样子,C这个操作实际上是一个粗糙的散列函数的整数乘法的方法称为Knuth,在无符号整数溢出进行moduolo操作。而且,对于任何好的散列函数,反复使用哈希本身的结果本质上产生一个伪随机值流。当然,这不是一个好的散列函数,所以重复使用这个散列本身会迅速恶化的随机性的质量,所以显然你不应该在生产代码中使用-但它适用于任何非关键,如代码诗!
神奇的数字0x9e3779b1只是一个大素数指定进制。从技术上讲,它可以取代任何其他大素数。最重要的是,它必须有几个因素,并有足够大的信息分配到更高的值位时,整数溢出。这个主要是最近的素数2 ^ 32 /Φ- Knuth最初的选择
在水里。我做了一些额外的坏事(TM)如使用一个64位有符号整数,使用未初始化的值作为随机种子的起始值,两者都是未定义的行为,但幸好GCC好心为我仍然有影响的我一直在寻找产生代码。古董鉴定
时间: 2024-11-08 11:55:45