电脑里生成的随机数其实都是伪随机数,也就是说表面看上去没有顾虑,但其实只是数字背后的规律非常负责罢了。今天,我们来介绍一种生成伪随机数的算法:线性同余。 x[i]=(x[i-1]*k)%m
时间: 2024-03-29 19:39:03 浏览: 59
线性同余算法是一种生成伪随机数的算法,它的基本形式如下:
x[i] = (a * x[i-1] + b) % m
其中,x[i] 是生成的第 i 个伪随机数,x[i-1] 是前一个伪随机数,a、b、m 是常数,称为“参数”。
线性同余算法的原理是:通过对前一个伪随机数进行一系列的乘、加、取模等数学运算,得到下一个伪随机数。如果选取的参数合适,生成的伪随机数序列看起来就像是随机的。
需要注意的是,如果选取的参数不合适,生成的伪随机数序列可能会出现周期性,即在一定的步长后会重复出现相同的数列。此外,在某些情况下,由于生成的伪随机数序列不够随机,可能会导致密码学等方面的安全问题。
因此,在实际应用中,需要谨慎选取线性同余算法的参数,或者使用更加安全的随机数生成算法。
相关问题
通过噪音生成的随机数是真随机数还是伪随机数
通过噪声生成的随机数通常被称为伪随机数。这是因为它们实际上是基于某种算法产生的,并非完全不可预测。这种技术常用于计算机程序中,如密码学、模拟实验等,因为虽然它们看起来随机,但如果知道生成算法和当前的状态(种子),理论上可以重现序列。
真正的随机数,也称为真随机数或物理随机数,来自自然界中无法预测的过程,比如大气噪声、放射性衰变等。然而,获取和处理真随机数在实际应用中往往困难,而且成本较高,所以计算机科学中广泛使用的仍是伪随机数生成器(PRNGs)。
c++ 电脑里生成的随机数其实都是伪随机数,也就是说表面看上去没有顾虑,但其实只是数字背后的规律非常负责罢了。今天,我们来介绍一种生成伪随机数的算法:线性同余。 x[i]=(x[i-1]*k)%m 举例如下: 随机种子x[0]=2 乘法系数k=3 取模数字m=7 可以依次生成以下“伪随机”数组x: x[0]=2 x[1]=(x[0]*k)%m=(2*3)%7=6 x[2]=(x[1]*k)%m=(6*3)%7=4 x[3]=(x[2]*k)%m=(4*3)%7=5 x[4]=(x[3]*k)%m=(5*3)%7=1 x[5]=(x[4]*k)%m=(1*3)%7=3 x[6]=(x[5]*k)%m=(3*3)%7=2 ... 请计算这个“伪随机”数组x的前m项。
根据线性同余法生成伪随机数的公式 x[i] = (x[i-1] * k) % m,其中 x[0] 是随机种子。我们可以使用循环来依次计算数组 x 的每一项:
```c++
#include <iostream>
using namespace std;
int main() {
int x[100], k, m;
cout << "请输入随机种子 x[0]:";
cin >> x[0];
cout << "请输入乘法系数 k 和取模数字 m:";
cin >> k >> m;
// 依次计算 x[1] 到 x[m-1]
for (int i = 1; i < m; i++) {
x[i] = (x[i-1] * k) % m;
}
// 输出数组 x 的前 m 项
for (int i = 0; i < m; i++) {
cout << "x[" << i << "] = " << x[i] << endl;
}
return 0;
}
```
程序中使用数组 x 存储生成的伪随机数组,使用循环计算 x 的每一项,最后输出 x 的前 m 项。例如,当随机种子 x[0] 为 2,乘法系数 k 为 3,取模数字 m 为 7 时,生成的伪随机数组 x 的前 7 项分别为:
```
x[0] = 2
x[1] = 6
x[2] = 4
x[3] = 5
x[4] = 1
x[5] = 3
x[6] = 2
```
这些数字看起来是随机的,但实际上它们都是按照一定规律计算出来的。如果使用不同的随机种子、乘法系数和取模数字,就可以生成不同的伪随机数序列。
阅读全文