首页 > 代码库 > 探秘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; }
向前走 就这么走 就算你被给过什么 向前走 就这么走 就算你被夺走什么 向前走 就这么走 就算会错过什么 向前走 就这么走开心的哼起歌~
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。