探秘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;
}

    向前走 就这么走
    就算你被给过什么
    向前走 就这么走
    就算你被夺走什么
    向前走 就这么走
    就算会错过什么
    向前走 就这么走

开心的哼起歌~

探秘rand神秘面纱

时间: 2024-07-30 15:21:05

探秘rand神秘面纱的相关文章

ASP.NET 运行时详解 揭开请求过程神秘面纱

对于ASP.NET开发,排在前五的话题离不开请求生命周期.像什么Cache.身份认证.Role管理.Routing映射,微软到底在请求过程中干了哪些隐秘的事,现在是时候揭晓了.抛开乌云见晴天,接下来就一步步揭开请求管道神秘面纱. 上篇回顾 在介绍本篇内容之前,让我们先回顾下上一篇<ASP.NET运行时详解 集成模式和经典模式>的主要内容.在上一篇随笔中,我们提到ASP.NET运行时通过Application的InitInternal方法初始化运行管道.ASP.NET运行时提供了两种初始化管道模

揭开Sass和Compass的神秘面纱

可能之前你像我一样,对Sass和Compass毫无所知,好一点儿的可能知道它们是用来作为CSS预处理的.那么,今天请跟我一起学习下Sass和Compass的一些基础知识,包括它们是什么.如何安装.为什么要使用.基础语法等一些基本知识.需要说明的是我也仅仅只是刚刚接触Sass和Compass,一些高级用法等将不再本文的讨论范围之内.接触一周以后发现Sass和Compass的用处非常大,也打算今后在项目中尝试引进并应用起来.希望读完以后,你跟我一样对Sass和Compass给你带来的东西非常开心,也

揭开.NET消息循环的神秘面纱(GetMessage()无法取得任何消息,就会进入Idle(空闲)状态,进入睡眠状态(而不是Busy Waiting)。当消息队列不再为空的时候,程序会自动醒过来)

揭开.NET消息循环的神秘面纱(-) http://hi.baidu.com/sakiwer/item/f17dc33274a04df2a9842866 曾经在Win32平台下奋战的程序员们想必记得,为了弄清楚“消息循环”的概念,度过多少不眠之夜.尽管如今在应用程序代码的编写过程中,我们已经不再需要它,但是深刻理解Windows平台内部的消息流转机制依然必要.. 在早年直接用Win32/Win16 API写程序的时代,消息循环是我们必须搞懂的第一个观念.现在,不管你用是Windows上面的哪一套

【安全健行】(4):揭开shellcode的神秘面纱

2015/5/18 16:20:18 前面我们介绍了shellcode使用的基本策略,包括基本的shellcode.反向连接的shellcode以及查找套接字的shellcode.在宏观上了解了shellcode之后,今天我们来深入一步,看看shellcode到底是什么.也许大家和我一样,从接触安全领域就听说shellcode,也模糊地知道shellcode基本就是那个攻击载荷,但是shellcode到底长什么样,却一直遮遮掩掩,难睹真容.趁今天这个机会,我们一起来揭开shellcode的神秘面

揭开RecyclerView的神秘面纱(二):处理RecyclerView的点击事件

前言 上一篇文章揭开RecyclerView的神秘面纱(一):RecyclerView的基本使用中,主要讲述了RecyclerView的基本使用方法,不同的布局管理器而造成的多样化展示方式,展示了数据之后,一般都会与用户进行交互,因此我们需要处理用户的点击事件.在ListView和GridView提供了onItemClickListener这个监听器,然而我们查找RecyclerView的API却没有类似的监听器,因此我们需要自己手动处理它的点击事件. 以下提供两种方法来实现处理Recycler

揭开源码的神秘面纱,让源码从此无处藏身

开始之前,想问一下大家开发中用的都是哪些反编译软件呢??? 开发过程中,我们总想看一下类的源代码,然后就按住Ctrl,在想看的类上鼠标轻轻一点.呈现在我们面前的现实却是残酷的. 就像图片中展示的那样令人郁闷..瞬间心灰意冷...泪奔有木有... 没事,我们可以使用反编译软件来查看源代码.LZ一直用的就是jd-gui.exe..但是很不方便有木有... 每次都要单独把要反编译的jar包扔进jd-gui.exe的可视化界面去执行..无法直接在myeclipse中查看... 要是能够直接在myEcli

Json系列之四 揭开JsonConfig的神秘面纱 java to json

//揭开JsonConfig的神秘面纱,for bean to json JsonConfig jsonConfig = new JsonConfig(); //忽略掉bean中含后某个注解的field,不转换成json,可以多次增加不同注解 //jsonConfig.addIgnoreFieldAnnotation(Person.class);//一定是注解的类,我这里没有例子,大家可以自己做 //同上 //jsonConfig.addIgnoreFieldAnnotation("person

iOS UIView动画实践(一):揭开Animation的神秘面纱

前言 在一个看脸的社会中,不论什么事物,长得好看总是能多吸引一些目光.App同样不例外,一款面相不错的App就算功能已经被轮子千百遍,依然会有人买账,理由就是看得顺眼,于是平面设计人员越来越被重视.白驹过隙,斗转星移,人们已然不满足于静态的美感,于是动态的用户体验应运而生,平面设计人员捉襟见肘,是我们程序员出马的时候了. 这篇文章是UIView Animation的第一篇,从极简的概念开始,为大家揭开Animation的神秘面纱.我们以一个登录界面为例.美丽的太阳,婀娜的云,还有几个小山包,中间

揭开RecyclerView的神秘面纱(一):RecyclerView的基本使用

前言 在Android开发中,我们经常与ListView.GridView打交道,它们为数据提供了列表和视图的展示方式,方便用户的操作.然而,随着Android的不断发展,单一的listview逐渐满足不了需求多变的项目了,因此,谷歌在support v7中,加入了新的控件--RecyclerView,该控件整合了ListView.GridView的特点,而且最大的优点是可以很方便实现瀑布流效果,因此RecyclerView受到越来越多的开发者重视.所以,学习RecyclerView的使用也是很