📄 rand.cpp
字号:
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <windows.h>
#include <fcntl.h>
#include <conio.h>
#include <string.h>
static int RAND_FLAG;
static unsigned long RAND_SEED_LONG[5];
static unsigned long RAND_LAGGED_LONG[17];
static unsigned long RAND_LAGGED_LONG2[17];
struct BLTS_RAND_STRU{
unsigned int rand_num; //!<产生随机数
unsigned int rand_cnt; //!<产生随机数次数
};
double rand_double(void)
{
int i,j,k;
clock_t t1,t2,t3;
unsigned long result=0;
unsigned long temp=0,temp1=0;
double finalresult=0;
if(RAND_FLAG==0)
{
/****获取一个时间值,使得随机数不可以预料****/
t1=clock();
for(i=0;i<23456;i++)
{
for(j=0;j<2000;j++)
{
}
}
t2=clock();
t3=t2-t1;
temp=(long)t3*17;//获取的值
/********初始化种子*********/
srand((unsigned int)time((time_t *)NULL));
temp=(long)rand()%1000+temp+12255;
for(i=0;i<5;i++)
{
RAND_SEED_LONG[i]=temp+i*10000;
}
for(i=0;i<17;i++)
{
RAND_LAGGED_LONG[i]=i*1234+temp;
RAND_LAGGED_LONG2[i]=i*rand()+temp*123456;
}
RAND_FLAG=1;
}
/****Multiplicative Linear congruential generators****/
RAND_SEED_LONG[0]=(RAND_SEED_LONG[0]*39373)%2147483647;
RAND_SEED_LONG[1]=(RAND_SEED_LONG[1]*16807)%2147483647;
RAND_SEED_LONG[2]=(RAND_SEED_LONG[2]*40014)%2147483563;
RAND_SEED_LONG[3]=(RAND_SEED_LONG[3]*40692)%2147483399;
RAND_SEED_LONG[4]=(RAND_SEED_LONG[4]*41546)%2147482811;
/***Lagged-Fibonacci generators***/
temp=(RAND_LAGGED_LONG[0]+RAND_LAGGED_LONG[12])%1073741824;
temp1=(RAND_LAGGED_LONG2[0]*RAND_LAGGED_LONG2[12])%1073741824;
for(i=0;i<16;i++)
{
RAND_LAGGED_LONG[i]=RAND_LAGGED_LONG[i+1];
RAND_LAGGED_LONG2[i]=RAND_LAGGED_LONG2[i+1];
}
RAND_LAGGED_LONG[16]=temp;
RAND_LAGGED_LONG2[16]=temp1;
/**下面把简单生成器的结果进行转换**/
k=1;
for(i=0;i<5;i++)
{
k=k*(-1);
result=(result+k*RAND_SEED_LONG[i])%2147483647;
}
k=-k;
result=(result-temp*k+k*temp1)%2147483647;
/***生成结果***/
finalresult=(double)result*1.0/2147483647;
//printf("finalresult:%0.8f\n", finalresult);
return finalresult;
}
void blts_rand(int min, int max, int num, BLTS_RAND_STRU *rand_stru)
{
int i;
unsigned int rand_num;
for(i = 0; i < num; i++)
{
rand_num = min + (int)(rand_double()*(max-min+1));
if(rand_stru[rand_num - min].rand_cnt == 0)
{
rand_stru[rand_num - min].rand_num = rand_num;
rand_stru[rand_num - min].rand_cnt ++;
}
else
{
if(rand_stru[rand_num - min].rand_num != rand_num)
{
printf("num err\n");
return;
}
else
{
rand_stru[rand_num - min].rand_cnt ++;
}
}
}
return;
}
void write_file(int min, int max, int num, BLTS_RAND_STRU *rand_stru, int time)
{
FILE *fp;
char filename[255];
int i;
sprintf(filename, "rand_%d_%d_%d.txt", min, max, num);
fp=fopen(filename,"a");
if(fp <= 0)
{
printf("open file err\n");
}
fseek(fp, 0, SEEK_END);
fprintf(fp, "\n min:%d \t max:%d \t num:%d\n", min, max, num);
fprintf(fp, " time(ms):%d\n", time);
fprintf(fp, " num \t cnt\n");
for(i = 0; i < max-min+1; i++)
{
if(rand_stru[i].rand_cnt != 0)
{
fprintf(fp, " %d \t %d\n", rand_stru[i].rand_num, rand_stru[i].rand_cnt);
}
}
fclose(fp);
}
void main()
{
int min = 0, max = 0, i, num;
BLTS_RAND_STRU *rand_stru;
clock_t start, end;
min = 1;
max = 10;
num = 10;
rand_stru = (BLTS_RAND_STRU*)malloc((max-min+1)*sizeof(BLTS_RAND_STRU));
if(rand_stru == NULL)
{
printf("malloc err\n");
}
memset(rand_stru, 0, ((max-min+1)*sizeof(BLTS_RAND_STRU)));
start = clock();
// init();
for(i = 0; i < 1; i++)
{
blts_rand(min, max, num, rand_stru);
}
end = clock();
write_file(min, max, num, rand_stru, end-start);
free(rand_stru);
/*
for(i = 0; i < max-min+1; i++)
{
printf(" %d \t %d\n", rand_stru[i].rand_num, rand_stru[i].rand_cnt);
}
*/
// fd=open("file.txt",O_RDWR|O_CREAT);
/* rc = fwrite(&rand_stru[0], 1, (max-min+1)*sizeof(BLTS_RAND_STRU), fp);
if(rc != ((max-min+1) * sizeof(BLTS_RAND_STRU)))
{
printf("write err\n");
free(rand_stru);
fclose(fp);
}
*/
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -