乘法同余法(Lehmer Method)是一种线性同余生成器,用于生成特定范围内的伪随机数。该方法可以定义为:
where,
X, the sequence of pseudo-random numbers
m ( > 0), the modulus
a (0, m), the multiplier
X0 [0, m), initial value of the sequence – termed as seed
m, a, and X0 should be chosen appropriately to get a period almost equal to m.
方法:
- 选择种子值 ( X 0 )、模参数 ( m ) 和乘数项 ( a )。
- 初始化所需数量的随机数以生成(例如,整数变量noOfRandomNums )。
- 定义存储以保留大小为noOfRandomNums的生成的随机数(此处考虑向量)。
- 用种子值初始化向量的第0个索引。
- 对于其余的索引,遵循乘法同余法来生成随机数。
randomNums[i] = (randomNums[i – 1] * a) % m
最后,返回随机数。
下面是上述方法的实现:
C++
// C++ implementation of the
// above approach
#include
using namespace std;
// Function to generate random numbers
void multiplicativeCongruentialMethod(
int Xo, int m, int a,
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 multiplicative
// congruential method
randomNums[i]
= (randomNums[i - 1] * a) % m;
}
}
// Driver Code
int main()
{
int Xo = 3; // seed value
int m = 15; // modulus parameter
int a = 7; // multiplier term
// Number of Random numbers
// to be generated
int noOfRandomNums = 10;
// To store random numbers
vector randomNums(noOfRandomNums);
// Function Call
multiplicativeCongruentialMethod(
Xo, m, a, 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
import java.util.*;
class GFG{
// Function to generate random numbers
static void multiplicativeCongruentialMethod(
int Xo, int m, int a,
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 multiplicative
// congruential method
randomNums[i] = (randomNums[i - 1] * a) % m;
}
}
// Driver code
public static void main(String[] args)
{
// Seed value
int Xo = 3;
// Modulus parameter
int m = 15;
// Multiplier term
int a = 7;
// Number of Random numbers
// to be generated
int noOfRandomNums = 10;
// To store random numbers
int[] randomNums = new int[noOfRandomNums];
// Function Call
multiplicativeCongruentialMethod(Xo, m, a,
randomNums,
noOfRandomNums);
// Print the generated random numbers
for(int i = 0; i < noOfRandomNums; i++)
{
System.out.print(randomNums[i] + " ");
}
}
}
// This code is contributed by offbeat
Python3
# Python3 implementation of the
# above approach
# Function to generate random numbers
def multiplicativeCongruentialMethod(Xo, m, a,
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] * a) % m
# Driver Code
if __name__ == '__main__':
# Seed value
Xo = 3
# Modulus parameter
m = 15
# Multiplier term
a = 7
# Number of Random numbers
# to be generated
noOfRandomNums = 10
# To store random numbers
randomNums = [0] * (noOfRandomNums)
# Function Call
multiplicativeCongruentialMethod(Xo, m, a,
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 multiplicativeCongruentialMethod(
int Xo, int m, int a,
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 multiplicative
// congruential method
randomNums[i] = (randomNums[i - 1] * a) % m;
}
}
// Driver code
public static void Main(String[] args)
{
// Seed value
int Xo = 3;
// Modulus parameter
int m = 15;
// Multiplier term
int a = 7;
// Number of Random numbers
// to be generated
int noOfRandomNums = 10;
// To store random numbers
int[] randomNums = new int[noOfRandomNums];
// Function call
multiplicativeCongruentialMethod(Xo, m, a,
randomNums,
noOfRandomNums);
// Print the generated random numbers
for(int i = 0; i < noOfRandomNums; i++)
{
Console.Write(randomNums[i] + " ");
}
}
}
// This code is contributed by sapnasingh4991
Javascript
输出:
3 6 12 9 3 6 12 9 3 6
时间复杂度: O(N),其中 N 是我们需要生成的随机数总数。
辅助空间:O(1)
伪的字面量意思是false 。这些随机数被称为伪数,因为使用了一些已知的算术程序来生成。甚至生成的序列也形成了一种模式,因此生成的数字似乎是随机的,但可能不是真正的随机。