Permuted Congruential Generator(置换同余发生器) 伪随机数生成 算法

看着是个更好点的随机数生成算法,  记录一下

 

以小的快速代码和小的状态大小实现了出色的统计性能, 在linear congruential generator上做出改进的

PCG在三个方面与经典线性同余生成器不同:

  • LCG模数和状态较大,通常是所需输出大小的两倍,
  • 它使用的是2模数,这使得全周期发生器和无偏输出位的实现特别有效,并且
  • 状态不是直接输出,而是使用状态的最高有效位来选择按位旋转或移位,将其应用于状态以产生输出。

 

//官网

http://www.pcg-random.org/


Testing non-cryptographic random number generators: my results

https://lemire.me/blog/2017/08/22/testing-non-cryptographic-random-number-generators-my-results/

https://github.com/lemire/testingRNG

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在C语言中实现Permuted Congruential Generator(PCG)算法,可以使用PCG官方提供的C语言参考实现。以下是一个简单的示例代码: ```c #include <stdint.h> typedef struct { uint64_t state; uint64_t inc; } pcg32_random_t; void pcg32_srandom_r(pcg32_random_t* rng, uint64_t initstate, uint64_t initseq) { rng->state = 0U; rng->inc = (initseq << 1u) | 1u; pcg32_random_r(rng); rng->state += initstate; pcg32_random_r(rng); } uint32_t pcg32_random_r(pcg32_random_t* rng) { uint64_t oldstate = rng->state; rng->state = oldstate * 6364136223846793005ULL + rng->inc; uint32_t xorshifted = ((oldstate >> 18u) ^ oldstate) >> 27u; uint32_t rot = oldstate >> 59u; return (xorshifted >> rot) | (xorshifted << ((-rot) & 31)); } int main() { pcg32_random_t rng; pcg32_srandom_r(&rng, 42u, 54u); // 初始化随机数生成器 for (int i = 0; i < 10; ++i) { uint32_t random_num = pcg32_random_r(&rng); // 生成随机数 printf("%u\n", random_num); } return 0; } ``` 在此示例中,我们定义了一个`pcg32_random_t`结构体来保存PCG算法的状态和步长。`pcg32_srandom_r`函数用于初始化随机数生成器的状态和步长,而`pcg32_random_r`函数则用于生成随机数。 在`main`函数中,我们首先创建一个`pcg32_random_t`结构体并使用`pcg32_srandom_r`函数初始化它。然后,我们使用`pcg32_random_r`函数生成10个随机数并打印出来。 请注意,这只是一个简单的示例代码,实际应用中可能需要根据具体需求进行适当的修改。此外,PCG算法还有其他变体和参数设置可供选择,您可以根据需要进行相应的调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值