首页 > 代码库 > 探秘rand神秘面纱

探秘rand神秘面纱

这位名字很长同学的帖子rand产生出的一个随机函数是递增的里看到对rand、种子值不解,以及老师说"因为相邻两轮循环的时间小于1秒,所以种子值就是相同的,于是随机数就是相同的",勾起了我对rand的兴趣。恰好前几天看the c programming language看到一些实现:

unsigned long int next = 1;
//rand函数,返回值在0~32767之间的伪随机数。
int rand(void){
    next = next * 1103515245 + 12345;
    return (unsigned int)(next/65536) % 32768;
}
    
//srand函数,为rand()函数设置种子值
void srand(unsigned int seed){
    next = seed;
}

然后自以为是的回答了。准备去看今天的新课10。无奈跑了一天睡意渐浓。便在睡前试验了下上面的定义是否真是具体的实现呢:

#include<stdio.h>
#include <stdlib.h>
  
 //自己定义的rand srand函数 
unsigned long int next_ = 1;

int rand_test(void){  
    next_ = next_ * 1103515245 + 12345;
    return (unsigned int)(next_/65536) % 32768;
}
void srand_test(unsigned int seed){
    next_ = seed;
}


int main(){
	//先输出没有用种子值的情况。 
	printf("%d - ",rand_test());
	printf("%d\n\n",rand());  

	int i=0;
	while(i++<20)
    { 
     	srand_test(i);
	 	printf("%d - ",rand_test());
	 	
	 	srand(i);
	 	printf("%d\n",rand());
	
	}
     
return 0;
}


哎呀我去,完全不对。

又自作聪明的右击rand()到实现,艾玛,转到stdlib.h头文件了,最多是个接口展示。没有想要的。

接着搜啊搜啊的,终于如愿。


rand 和 srand 标准库的源码。看的不是很懂。况且还有冒出来的结构成员什么的。

看到srand()确实只是赋值了下。

rand()呢,_getptd()函数先不去管,下面返回这么长。照猫画虎弄过来吧。

#include<stdio.h>
#include <stdlib.h>
  
 //自己定义的rand srand函数 
unsigned long int next_ = 1;


void srand_test(unsigned int seed){
    next_ = seed;
}
int rand_test(void){
    return next_= (((next_ * 214013L + 2531011L) >> 16) & 0x7fff );
}

int main(){
	//先输出没有用种子值的情况。 
	printf("%d - ",rand_test());
	printf("%d\n\n",rand());  

	int i=0;
	while(i++<20)
    { 
     	srand_test(i);
	 	printf("%d - ",rand_test());
	 	
	 	srand(i);
	 	printf("%d\n",rand());
	
	}
     
return 0;
}




    向前走 就这么走
    就算你被给过什么
    向前走 就这么走
    就算你被夺走什么
    向前走 就这么走
    就算会错过什么
    向前走 就这么走
开心的哼起歌~