随机数生成的方式一般有两种,分别为:
硬件生成随机数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 <benchmark/benchmark.h>
#include <random>
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<int> dist(0, 9);
for (auto _ : state){
rd();
}
}
BENCHMARK(BM_HRNG);
BENCHMARK_MAIN();
使用种子和 SFC32 生成随机数 js + c++
如何在 javascript 中使用种子生成随机数_seedrandom.js_迹忆客的博客-CSDN博客文章来源:https://www.toymoban.com/news/detail-686381.html
javascrpti 的随机函数 xorshift128 +文章来源地址https://www.toymoban.com/news/detail-686381.html
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;
}
到了这里,关于真伪随机数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!