📄 伪随机数发生器.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 + -