📜  生成伪随机数的乘法同余方法

📅  最后修改于: 2021-05-04 20:05:01             🧑  作者: Mango

乘法同余方法(Lehmer方法)是一种线性同余生成器,用于生成特定范围内的伪随机数。此方法可以定义为:

方法:

  • 选择种子值(X 0 ),模量参数(m)和乘项(a)。
  • 初始化所需数量的随机数以生成(例如,整数变量noOfRandomNums )。
  • 定义一个存储区,以保持生成的随机数(此处为vector )的大小为noOfRandomNums
  • 用种子值初始化向量的0索引。
  • 对于其余的索引,请遵循乘法同余法以生成随机数。

最后,返回随机数。
下面是上述方法的实现:

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


输出:
3 6 12 9 3 6 12 9 3 6

的字面量意思是假的。这些随机数被称为伪数,因为利用了一些已知的算术过程来生成。即使生成的序列也形成一个模式,因此生成的数字似乎是随机的,但可能不是真正的随机