⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 伪随机数发生器.c

📁 均匀分布伪随机数发生器 伪随机数在计算机软件设计中有很广泛的用途。本文介绍了基于数学方法的利用计算机产生伪随机数的一种方法
💻 C
字号:
#include <stdio.h>  /*函数printf需要*/
#include <stdlib.h> /*函数exit需要*/
#include <string.h> /*函数strlen需要*/
#include <time.h>   /*函数time需要*/

#define WORDLONG 65536.0 /*定义16位字长*/

/*
 * 函数名称:print_array
 * 函数功能:打印生成样本
 * 入口参数:int N--样本总数
 * double r[]--样本矩阵数组的地址
 * 出口参数:无
 * 调用格式: print_array(N,a);
 */

void print_array(int N, double r[])
{       FILE *stream;
        int i, j;
        if((stream=fopen("random.txt","wb"))==NULL)
		{ 
      fprintf(stderr, "Cannot open output file.\n"); 
//      break; 
		} 
		fwrite(&r, sizeof(double), 100, stream); /* write struct s to file */ 
        fclose(stream);
        

        for (i=0, j=0; i<N; i++) {
                printf("%14f", r[i]);
                j++;
                if (j == 5) {
                        printf("\n");
                        j = 0;
                }
        }
        if (j != 5 && i != N) {
                printf("\n");
        }

}

/*
 * 函数名称:rand1
 * 函数功能:生成一个伪随机数
 * 入口参数:double srand--均匀分布随机数发生器的种子。
 * 如果种子相同,则生成相同。
 * 出口参数:返回值为生成的样本点
 * 调用格式: rand1(srand)
 * 算法依据:r[n] = (a * r[n-1] + b) mod M
 * 其中M为计算机的一个字长,这里取2的16次方,也就是
 * 16位长。
 */

double rand1(double srand)
{
        double a, b;

        a = 2053.0;
        b = 13849.0;
        srand = a*srand + b;
        srand = srand - ((int)(srand/WORDLONG))*WORDLONG;
        return srand;
}

/*
 * 函数名称:rand2
 * 函数功能:生成随机样本,并且根据flag判断打印U(0,65535)
 * 还是U(0,1)
 * 入口参数:int N--样本容量
 * int flag--标志位,如果为1,则生成U(0,65535)
 * 如果为0,则生成U(0,1)
 * 出口参数:无
 * 调用格式: rand2(N, flag);
 * 说 明:求r[0]是采用了函数time获取当前时间作为参数,因
 * 为当前时间不同,保证了srand不同,两次生成样本
 * 就不相同,所以两次样本代表变量相互独立。
 */

void rand2(int N, int flag)
{
        int i;
        double r[100];

        r[0] = rand1((double)time(NULL));
        for (i=1; i<N; i++) {
                r[i] = rand1(r[i-1]);
        }

        if (flag) {
                print_array(N, r);
        }
        else {
                for (i=0; i<N; i++) {
                        r[i] = r[i]/WORDLONG;
                }
                print_array(N, r);
        }
}

/*
 * 函数名称:count
 * 函数功能:将字符串转化为一个整数,作为打印样本的总数。
 * 入口参数:int N--样本容量
 * char *argv--命令行字符串
 * 出口参数:返回值为样本的总数
 * 调用格式: count(N, argv);
 */

long count(int N, char *argv)
{
        int i = 0;
        int w = 1;
        int times = 0;
        int p[100];

        while (N--) {
                p[i] = argv[i] - '0'; /*一个字符对应的整数*/
                i++;
        }

        while(i--){
                times += p[i] * w;   /*计算字符串对应的整数*/
                w = w*10;            /*其中10为权重*/
        }

        return times;
}

/*
 * 函数名称:main
 * 入口参数: 采用从命令行传递参数的方法
 * 第一个参数为设定生成样本的总数
 * 第二个参数为设定flag,1--U(0,32767)
 * 0--U(0,1)
 *格式说明: 当没有输入参数时,默认N=100,flag=0
 * 当输入一个参数时,默认flag=0
 * 当输入两个参数时,按照输入值处理
 * 不是上述情况,则进行出错处理
 * 出口参数:无
 */

int main(int argc, char *argv[])
{
        int N;
        int flag;
		putchar();

        /*命令行参数处理*/
        if (argc == 1) {
                N = 100;
                flag = 0;
        }
        else if (argc == 2) {
                N = count(strlen(argv[1]), argv[1]);
                flag = 0;
        }
        else if (argc == 3) {
                N = count(strlen(argv[1]), argv[1]);
                flag = argv[2][0] - '0';
        }
        else {
                printf("Usage: filename [N] [flag]\n");
                exit(1);
        }

        /*生成均匀随机数样本*/
        rand2(N, flag);

        return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -