伪随机数和真随机数有什么区别?
What's the difference between pseudo random and truly random numbers?
C++中真正的随机数和伪随机数之间的区别是什么?(我想,它希望我把问题提得更长,尽管我已经尽可能地把问题提出来了。我认为这就是我最后一个问题没有得到很好回应的原因,我可能错了。我确实在谷歌上搜索了这个,但我没有成功。)
伪随机数不是真正的随机数,因为它们是使用确定性过程生成的。例如,如果我想要一个0到4之间的随机数,并且我可以访问以秒为单位的当前时间,我可以通过对时间值应用模5来生成伪随机数,这将返回一个0和4之间的不同数字。该数字不是真正随机的原因是,通过知道时间,可以在生成之前预测该数字。一个真正随机的数字是永远无法预测的。
你可以在谷歌上搜索"决定论"来获取更多信息。
这个问题可能会导致一个非常深刻的哲学兔子洞。如果自然界中真的有一个过程是不确定的,这是一个悬而未决的问题。量子力学表明,宇宙是非确定性的,但在某种程度上具有确定性概率定律。然而,这并不排除这样一种可能性,即在更基本的层面上,存在一个确定性过程,它只是在更大的范围内看起来是随机的。随机性和混乱是密切相关的,但它们并不一定意味着相同的东西。
因此,单词random可能意味着几个不同的东西。出于实际目的,我们可以将随机性视为某种类型的数学模式,具有一定的特征。随机过程通常遵循一些概率分布(即白噪声、粉红噪声、高斯、泊松等),但当您对随机过程的输出进行采样时,实际上不可能预测单个结果。
伪随机数生成器或PRNG使用一种算法,该算法采用确定性混沌来创建在统计上与真正的随机过程相似的模式。PRNG通常使用起始点或种子。使用时间函数的输出来播种PRNG是很常见的。PRGNs有许多不同的算法,其性能和质量各不相同。
PRNG的一个显著弱点是输出最终重复或是周期性的。如果知道算法和起点(种子),也有可能重新创建完全相同的序列,因为数字计算机必然是确定性设备。依赖PRNG的安全机制由于其使用的PRNG,通常具有隐藏的漏洞。
某些应用,特别是在安全性方面,或者例如彩票,需要一个真正的随机数生成器。硬件设备是可用的,利用物理现象。例如,热噪声(即电子的随机运动)由量子力学行为控制,并且经常用于RNG硬件实现中。某些量子力学现象通常被认为是随机的。根据量子力学的大多数标准解释,即使你有一个完整的系统模型(即薛定谔方程的时间演化)和所有初始变量的知识,你仍然无法准确预测测量的下一个结果。
理论上,你也可以使用无线电背景噪声(想想电视静态或电台之间的无线电噪声)。这些信号源中的任何一个都可以被滤波或用作PRNG的输入,以创建高质量的随机序列,而没有任何明显的统计可预测性。
这里有一个非常简单的玩具PRNG算法,可以让你玩一玩,并帮助你理解这个概念。
// linear congruential generator
int seed 123456789;
int rand() {
seed = ( a * seed + c ) % m;
return seed;
}
以上内容取自特殊简单随机数生成器。我希望这能对你的问题有所启发。
真正的随机数和伪数之间的区别是什么C++中的随机数?
在C++中,可以重复伪随机数序列。一个"真正随机"的数字(我认为C++和C都不支持,没有自定义硬件)不能重复。
标记为C++,因此这里有一种C++方法。
最近我一直在使用C++提供的东西,但我仍然通过打乱一个简单的值向量来控制数字的范围。这也支持将相同的随机洗牌应用于多个测试,或重复一个序列。
typedef std::vector<int> IntVec_t; // a convenient type
IntVec_t iVec; // a std vector of int
for (int i=1; i<=32; ++i)
iVec.push_back(i); // add 32 ints, range 1..32
{
std::random_device rd; // the generator uses this
std::mt19937_64 gen(rd()); // there are several generators available
std::shuffle (iVec.begin(), iVec.end(), gen); // shuffle the vector
}
初始化为:(一行16个元素)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
混乱的内容(可能):
29 26 12 16 20 7 31 28 30 18 4 23 17 14 32 1
11 13 5 6 9 2 19 10 21 24 3 8 25 27 22 15
简而言之伪数在中具有重复性
真正的随机数没有重复,它有一个种子,比如时间或其他任何东西每次都会明显不同。
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 整数不会重复超过随机数
- int(c) 和 c-'0' 之间的区别。C++
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- C++ - "!pointer"和"pointer == nullptr"的区别?
- C++ 使用 assign 函数的字符串与直接使用 '=' 更改值的字符串之间的区别
- std::atomic和std::condition_variable wait,notify_*方法之间的区别
- 在 .h 文件中的类中声明静态变量和在.cpp文件中声明"global"变量有什么区别
- 我是C++编程的新手,这些代码之间有什么区别,我应该使用哪一个
- 在 const 函数中通过引用和指针返回之间的区别
- 我想知道长双倍和双倍之间的区别
- 返回常量对象引用 (getter) 和仅返回字符串有什么区别?
- if数组上的随机数
- 返回递归调用和仅递归调用的区别
- 在将数字随机生成为数组期间从内存输出随机数的数组
- Qt:remove() 和 rmdir() 有什么区别
- 半随机数生成C++
- 随机数生成器的种子和状态有什么区别?
- 伪随机数和真随机数有什么区别?