伪随机数生成算法——线性同余法

文章介绍了如何使用LCG(线性同余法)生成伪随机数,包括关键参数的选择和算法原理。通过示例代码展示了如何在C语言中实现这一算法,并讨论了确保最大周期的条件,如C和M互质,以及A、C、seed与M的关系等。

获取随机数一般很容易,只需要

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main()
{
    int i;
    // 使用系统时间作为种子(初始化随机数,用于确定随机数生成器生成随机数序列的起点),确保每次运行产生不同的随机数序列,函数time返回从1970.1.1以来经历的秒数
    srand(time(NULL));
    for (i = 0; i < 10; i++) {
        int random_num = rand();
        printf("%d\n", random_num);
    }

    return 0;
}

本文探讨使用静态随机变量实现伪随机数生成——LCG算法

先给代码(两个文件):

// 文件:main.c
#include <stdio.h>
#include <time.h>
#define N 100
void mysrand(unsigned);
unsigned myrand();

int main() {
    int i, head = 0, reverse = 0;
    mysrand(time(NULL));
    for (i = 0; i < N; i++)
    {
        if (myrand() % 2)  head++;
        else   reverse++;
    }
    printf("%d%d\n", head, reverse);
    return 0;
}
// 文件:rand.c
#define INITIAL_SEED 17
#define MULTIPLIER 25173
#define INCREMENT 13849
#define MODULUS 32767
static unsigned long seed = INITIAL_SEED;  // 种子
unsigned myrand()
{
	seed = (seed * MULTIPLIER + INCREMENT) % MODULUS;
	return seed;  // 0~MODULUS的随机整数
}
void mysrand(unsigned x)
{
	seed = x;  // 用形参x初始化随机数的种子
}

使用static定义静态随机变量可以让seed只被当前文件内的函数使用,不会被其它文件误使用。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值