真伪随机数

随机数生成的方式一般有两种,分别为:

硬件生成随机数Hardware RNG,原理是用某个仪器一直探测环境中的物理量(比如说,时钟,IO 请求的响应时间,特定硬件中断的时间间隔,键盘敲击速度,鼠标位置变化,甚至周围的电磁波等等……直观地讲,你每按一次键盘,动一下鼠标,邻居家 wifi 信号强度变化,磁盘写入速度等等信号,都可能被用来生成随机数。),将该物理量作为随机数,比如 Intel 和 AMD CPU指令集中的 RDRAND 指令,C++ 中random_device就是利用RDRAND实现的。

算法生成随机数,比如c++中的 mt19937梅森旋转算法即为一种软件层面的随机数生成算法算法。如果知道了seed和算法的具体实现,别人就可以知道你生成的随机数序列。所以,又被称为 伪随机数生成器 Pseudo RNG。其他的PRNG算法包括 Xorshift,linear congruential generators等。

为什么不直接使用 std::random_device呢? 因为 std::random_device 不是跨平台的,依赖于硬件具体的实现,C++标准没有严格要求,编译器可能会偷懒,用伪随机数糊弄你(特指mingw),而 mt19937 是跨平台的。其次,HRNG 要慢上许多,这里用 google-benchmark 对比了linux(ubuntu 20.04, gcc 9.2.0)下 std::random_device 和 std::mt19937 的执行速度:

#include 
#include 

static void BM_PRNG(benchmark::State& state) {
    std::random_device rd;
    std::mt19937 e{rd()};
    for (auto _ : state){
        e();
    }
}
BENCHMARK(BM_PRNG);

static void BM_HRNG(benchmark::State& state) {
    std::random_device rd;
    std::uniform_int_distribution dist(0, 9);
    for (auto _ : state){
        rd();
    }
}
BENCHMARK(BM_HRNG);

BENCHMARK_MAIN();

使用种子和 SFC32 生成随机数 js + c++

如何在 javascript 中使用种子生成随机数_seedrandom.js_迹忆客的博客-CSDN博客

javascrpti 的随机函数  xorshift128 +

 uint64_t xorshift128plus() {
  uint64_t s1 = state0;
  uint64_t s0 = state1;
  state0 = s0;
  s1 ^= s1 << 23;
  s1 ^= s1 >> 17;
  s1 ^= s0;
  s1 ^= s0 >> 26;
  state1 = s1;
  return state0 + state1;
}

你可能感兴趣的:(开发语言)