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

📄 rand.cpp

📁 随机数算法
💻 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 + -