C语言新手,求大神解惑!!!!!

2024-11-20 20:40:08
推荐回答(5个)
回答1:

/*
C 语言里面的随机函数:
void srand( unsigned seed );
功能: 设置rand()随机序列种子。对于给定的种子seed, rand()会反复产生特定的随机序列。

int rand( void );
功能: 函数返回一个在 0 到 RAND_MAX(32767) 之间的【伪】随机整数。

--------------------------------

伪随机数并非真随机数,而仅是具有一定随机程度的伪随机数。
在Wikipedia上对伪随机数的解释是这样的:
伪随机数,或称伪乱数,是使用一个【确定性的算法】计算出来的似乎是随机的数序,因此伪随机数实际上并不随机。
在计算伪随机数时【假如使用的开始值不变】的话,那么伪随机数的数序也不变。

伪随机数的【随机性】可以用它的统计特性来衡量,其主要特征是每个数出现的可能性和它出现时与数序中其它数的关系。

伪随机数的优点是它的计算比较简单,而且只使用少数数值很难推算出计算它的算法。
一般人们使用一个假的随机数,比如【电脑上的时间】作为计算伪随机数的开始值。

--------------------------------

随机数的随机性分析:
1) 最大重复:同样的数值出现的最大次数。
例如生成100个随机数(0,1,2...),其中1出现了60次,则最大重复为60

2)跳变:当某次生成的随机数和前次不同,则跳变数+1

*/
#include
#include
#include
#include
#define DATA_SIZE (RAND_MAX+1)
#define UNDEFINE (-1)

int main(int argc, char *argv[])
{
// test_times 规定了测试次数。一次测试产生一个随机数。
// 测试次数需要时 DATA_SIZE 的整数倍
unsigned int test_times = DATA_SIZE*10;

// total 数组统计所有随机数出现的频率
unsigned int total[DATA_SIZE]={0};
// hop_times 记录跳变次数
unsigned int hop_times;

int i,n,pre_n = UNDEFINE;
int min_repeat_times=UNDEFINE,max_repeat_times=UNDEFINE;
int average = test_times/DATA_SIZE,square_deviation = 0;

/** 产生若干随机数 **/
srand(time(NULL));
for(i=0;i {
// 生成一个随机数
n = rand();
// 记录是否跳变
hop_times += (pre_n!=UNDEFINE && pre_n != n)?1:0;
pre_n = n;

// 统计出现次数
total[n]++;
}

/** 下面开始分析随机性 **/
for(i=0;i {
min_repeat_times =
(min_repeat_times == UNDEFINE || min_repeat_times>total[i])
? total[i]
: min_repeat_times;

max_repeat_times =
(max_repeat_times == UNDEFINE || max_repeat_times ? total[i]
: max_repeat_times;

square_deviation += (average - total[i])*(average - total[i]);
}

printf("一共产生%d个随机数。统计出现次数如下:\n",test_times);
// for(i=0;i
printf("最小重复次数:%d,最大重复次数:%d。\n",min_repeat_times,max_repeat_times);
printf("重复次数的标准差为:%d。\n",(int)sqrt(square_deviation));

printf("跳变次数:%d。\n",hop_times);
return 0;
}

回答2:

int rand(void); 返回的n是一个界于0~32767(0x7FFF)之间的伪随机数,包括0和32767。
#include  
#include  
#include //必须要引用的头文件;
srand((unsigned)time()); //初始化秒级随机种子;
srand((unsigned)clock()/CLOCKS_PER_SEC); //初始化处理器时钟级随机种子;
n=rand()%(Y-X+1)+X; //输出n为X~Y之间的随机数;

//基于毫秒级随机数产生方法   
#include      
srand(GetTickCount()/CLK_TCK);

测试随机数函数的随机性,就是通过对m次调用rand()函数生成m个"随机数"样本N(n1,n2,...),证明其满足中心为(X+Y)/2的正态分布(对称分布),并且k阶距样本数误差小于任一最小动查。

如果认真做你会发现结果很有意思,随机种子精度低的时候你会找到随机函数的非对称分布性,进而映射出随机数可能由几次函数发生器生成的。

回答3:

你可以写一个测试函数,调用随机数函数,检测调用多少次以后会出现两个相同的数。
比如随机产生了数字1,调用10000次后,又产生了随机数1。随机性就可以理解为万分之一

回答4:

比如产生0-9的随机数,你可以统计0-9的产生次数,然后除以总次数,看看频率是否为0.1。如果是说明随机性较好。

回答5:

直接测试真假的概率,理论上概率是各50%,你用随机函数测试1000遍,看看真的概率是否接近50%,越接近说明随机性越好。