软件实现的算法都是伪随机算法,随机种子一般是系统时间
在数论中,线性同余方程是最基本的同余方程,“线性”表示方程的未知数次数是一次,即形如:
ax≡b (mod n)的方程。此方程有解当且仅当 b 能够被 a 与 n 的最大公约数整除(记作 gcd(a,n) | b)。这时,如果 x0 是方程的一个解,那么所有的解可以表示为:
{x0+kn/d|(k∈z)}
其中 d 是a 与 n 的最大公约数。在模 n 的完全剩余系 {0,1,…,n-1} 中,恰有 d 个解。
例子编辑
* 在方程
3x ≡ 2 (mod 6)
中, d = gcd(3,6) = 3 ,3 不整除 2,因此方程无解。
* 在方程
5x ≡ 2 (mod 6)
中, d = gcd(5,6) = 1,1 整除 2,因此方程在{0,1,2,3,4,5} 中恰有一个解: x=4。
* 在方程
4x ≡ 2 (mod 6)
中, d = gcd(4,6) = 2,2 整除 2,因此方程在{0,1,2,3,4,5} 中恰有两个解: x=2 and x=5。
纯线性同余随机数生成器
线性同余随机数生成器介绍:
古老的LCG(linear congruential generator)代表了最好最朴素的伪随机数产生器算法。主要原因是容易理解,容易实现,而且速度快。
LCG 算法数学上基于公式:
X(0)=seed;
X(n+1) = (A * X(n) + C) % M;
其中,各系数为:
X(0)表示种子seed
模M, M > 0
系数A, 0 < A < M
增量C, 0 <= C < M
原始值(种子) 0 <= X(0) < M
其中参数c, m, a比较敏感,或者说直接影响了伪随机数产生的质量。
一般来说我们采用M=(2^31)-1 = 2147483647,这个是一个31位的质数,A=48271,这个A能使M得到一个完全周期
,这里C为奇数,同时如果数据选择不好的话,很有可能得到周期很短的随机数,例如
,如果我们去Seed=179424105的话,那么随机数的周期为1,也就失去了随机的意义。
栈(计算机术语)
在数论中,线性同余方程是最基本的同余方程,“线性”表示方程的未知数次数是一次,即形如:
ax≡b (mod n)的方程。此方程有解当且仅当 b 能够被 a 与 n 的最大公约数整除(记作 gcd(a,n) | b)。这时,如果 x0 是方程的一个解,那么所有的解可以表示为:
{x0+kn/d|(k∈z)}
其中 d 是a 与 n 的最大公约数。在模 n 的完全剩余系 {0,1,…,n-1} 中,恰有 d 个解。
例子编辑
* 在方程
3x ≡ 2 (mod 6)
中, d = gcd(3,6) = 3 ,3 不整除 2,因此方程无解。
* 在方程
5x ≡ 2 (mod 6)
中, d = gcd(5,6) = 1,1 整除 2,因此方程在{0,1,2,3,4,5} 中恰有一个解: x=4。
* 在方程
4x ≡ 2 (mod 6)
中, d = gcd(4,6) = 2,2 整除 2,因此方程在{0,1,2,3,4,5} 中恰有两个解: x=2 and x=5。
纯线性同余随机数生成器
线性同余随机数生成器介绍:
古老的LCG(linear congruential generator)代表了最好最朴素的伪随机数产生器算法。主要原因是容易理解,容易实现,而且速度快。
LCG 算法数学上基于公式:
X(0)=seed;
X(n+1) = (A * X(n) + C) % M;
其中,各系数为:
X(0)表示种子seed
模M, M > 0
系数A, 0 < A < M
增量C, 0 <= C < M
原始值(种子) 0 <= X(0) < M
其中参数c, m, a比较敏感,或者说直接影响了伪随机数产生的质量。
一般来说我们采用M=(2^31)-1 = 2147483647,这个是一个31位的质数,A=48271,这个A能使M得到一个完全周期
,这里C为奇数,同时如果数据选择不好的话,很有可能得到周期很短的随机数,例如
,如果我们去Seed=179424105的话,那么随机数的周期为1,也就失去了随机的意义。
(48271*179424105+1)mod(2的31次方-1)=179424105
自己写个简单例子,随机10万次,随机范围0到9,看看是否均匀
相对来说还是挺均匀的
队列(常用数据结构之一)
队列是一种特殊的
线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。
栈(计算机术语)
栈 (stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。向一个 栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除 掉,使其相邻的元素成为新的栈顶元素。
特点:先进先出
应用案例:1单词逆序
2分隔符匹配