可加同余方法是一种线性同余生成器,用于生成特定范围内的伪随机数。此方法可以定义为:
where,
X, the sequence of pseudo-random numbers
m ( > 0), the modulus
c [0, m), the increment
X0 [0, m), initial value of the sequence – termed as seed
m, c, X0 should be chosen appropriately to get a period almost equal to m.
方法:
- 选择种子值X 0 ,模量参数m和增量项c。
- 初始化所需数量的随机数以生成(例如,整数变量noOfRandomNums )。
- 定义存储以保持生成的随机数(此处为vector )的大小为noOfRandomNums 。
- 用种子值初始化向量的第0个索引。
- 对于其余索引,请遵循加法同余法来生成随机数。
randomNums[i] = (randomNums[i – 1] + c) % m
最后,返回生成的随机数。
下面是上述方法的实现:
C++
// C++ implementation of the
// above approach
#include
using namespace std;
// Function to generate random numbers
void additiveCongruentialMethod(
int Xo, int m, int c,
vector& randomNums,
int noOfRandomNums)
{
// Initialize the seed state
randomNums[0] = Xo;
// Traverse to generate required
// numbers of random numbers
for (int i = 1; i < noOfRandomNums; i++) {
// Follow the additive
// congruential method
randomNums[i]
= (randomNums[i - 1] + c)
% m;
}
}
// Driver Code
int main()
{
int Xo = 3; // seed value
int m = 15; // modulus parameter
int c = 2; // increment term
// Number of Random numbers
// to be generated
int noOfRandomNums = 20;
// To store random numbers
vector randomNums(noOfRandomNums);
// Function Call
additiveCongruentialMethod(
Xo, m, c,
randomNums,
noOfRandomNums);
// Print the generated random numbers
for (int i = 0; i < noOfRandomNums; i++) {
cout << randomNums[i] << " ";
}
return 0;
}
Java
// Java implementation of the
// above approach
class GFG{
// Function to generate random numbers
static void additiveCongruentialMethod(
int Xo, int m, int c,
int []randomNums,
int noOfRandomNums)
{
// Initialize the seed state
randomNums[0] = Xo;
// Traverse to generate required
// numbers of random numbers
for(int i = 1; i < noOfRandomNums; i++)
{
// Follow the additive
// congruential method
randomNums[i] = (randomNums[i - 1] + c) % m;
}
}
// Driver Code
public static void main(String[] args)
{
// Seed value
int Xo = 3;
// Modulus parameter
int m = 15;
// Increment term
int c = 2;
// Number of Random numbers
// to be generated
int noOfRandomNums = 20;
// To store random numbers
int []randomNums = new int[noOfRandomNums];
// Function Call
additiveCongruentialMethod(Xo, m, c,
randomNums,
noOfRandomNums);
// Print the generated random numbers
for(int i = 0; i < noOfRandomNums; i++)
{
System.out.print(randomNums[i] + " ");
}
}
}
// This code is contributed by PrinciRaj1992
Python3
# Python3 implementation of the
# above approach
# Function to generate random numbers
def additiveCongruentialMethod(Xo, m, c,
randomNums,
noOfRandomNums):
# Initialize the seed state
randomNums[0] = Xo
# Traverse to generate required
# numbers of random numbers
for i in range(1, noOfRandomNums):
# Follow the linear congruential method
randomNums[i] = (randomNums[i - 1] + c) % m
# Driver Code
if __name__ == '__main__':
# Seed value
Xo = 3
# Modulus parameter
m = 15
# Multiplier term
c = 2
# Number of Random numbers
# to be generated
noOfRandomNums = 20
# To store random numbers
randomNums=[0] * (noOfRandomNums)
# Function Call
additiveCongruentialMethod(Xo, m, c,
randomNums,
noOfRandomNums)
# Print the generated random numbers
for i in randomNums:
print(i, end = " ")
# This code is contributed by mohit kumar 29
C#
// C# implementation of the
// above approach
using System;
class GFG{
// Function to generate random numbers
static void additiveCongruentialMethod(
int Xo, int m, int c,
int []randomNums,
int noOfRandomNums)
{
// Initialize the seed state
randomNums[0] = Xo;
// Traverse to generate required
// numbers of random numbers
for(int i = 1; i < noOfRandomNums; i++)
{
// Follow the additive
// congruential method
randomNums[i] = (randomNums[i - 1] + c) % m;
}
}
// Driver Code
public static void Main(String[] args)
{
// Seed value
int Xo = 3;
// Modulus parameter
int m = 15;
// Increment term
int c = 2;
// Number of Random numbers
// to be generated
int noOfRandomNums = 20;
// To store random numbers
int []randomNums = new int[noOfRandomNums];
// Function call
additiveCongruentialMethod(Xo, m, c,
randomNums,
noOfRandomNums);
// Print the generated random numbers
for(int i = 0; i < noOfRandomNums; i++)
{
Console.Write(randomNums[i] + " ");
}
}
}
// This code is contributed by PrinciRaj1992
Javascript
输出:
3 5 7 9 11 13 0 2 4 6 8 10 12 14 1 3 5 7 9 11
伪的字面量意思是假的。这些随机数被称为伪数,因为利用了一些已知的算术过程来生成。即使生成的序列也形成一个模式,因此生成的数字似乎是随机的,但可能不是真正的随机。