版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 伪均匀随机数的计算机检验摘要现代社会中,计算机能力的提高使得随机数发生器在众多领域中有了较为广泛的应用,如蒙特卡罗方法,统计抽样技术和密码学等。同时关于随机数发生器也产生了很多的理论和方法,本文将简单介绍一些常见的伪均匀随机数发生器:线性同余发生器(LCG方法)和反馈位移寄存器法(FSR方法)。然后对伪均匀随机数序列进行统计检验。主要检验方法有参数检验(包括均值、方差或各阶距)、均匀性检验(包括卡方、柯氏和序列检验)、独立性检验(包括相关系数、列联表和游程检验)。最后,本文将利用Matlab生成一列随机数,并运用SPSS统计软件对此列随机数的统计特性择其适合的方法进行检验。关键词:伪随机数;
2、随机数发生器;统计检验;SPSS统计分析AbstractIn modern society, the improvement of computer capabilities make random number generator widely used in many areas, such as the Monte Carlo method, statistical sampling techniques and cryptography. At the same time there are a lot of theories and methods on the random num
3、ber generator, I will introduce some of the common random number generators briefly in this article: linear congruential generator (LCG method) and feedback shift register method (FSR method) . Then I will do statistical tests with the sequence of random numbers . Main methods are: parameter test (i
4、nvolving the mean, variance, or the order from) ,the test of homogeneity (involving Chi-square, Coriolis and sequence test), test for independence (involving the correlation coefficient, contingency table and the runs test. Finally ,this paper will use the Matlab generate a sequence of random number
5、s, use SPSS and select the appropriate test methods to test statistical properties of the sequence of random numbers.Key words: random number, random number generator, statistical test,SPSS statistical analysis目录 TOC o 1-3 h z u HYPERLINK l _Toc263191866 摘要 PAGEREF _Toc263191866 h I HYPERLINK l _Toc
6、263191867 Abstract PAGEREF _Toc263191867 h II HYPERLINK l _Toc263191868 一、引言1 HYPERLINK l _Toc263191869 1基本概念和定理 PAGEREF _Toc263191869 h 1 HYPERLINK l _Toc263191870 2 伪随机数 PAGEREF _Toc263191870 h 2 HYPERLINK l _Toc263191871 二、产生随机数的一般方法3 HYPERLINK l _Toc263191872 2.1 取中法3 HYPERLINK l _Toc263191873 2
7、.1.1 平方取中法3 HYPERLINK l _Toc263191874 2.1.2乘积取中法 PAGEREF _Toc263191874 h 3 HYPERLINK l _Toc263191875 2.2 同余发生器 PAGEREF _Toc263191875 h 3 HYPERLINK l _Toc263191876 2.2.1混合同余法4 HYPERLINK l _Toc263191877 2.2.2乘同余法 PAGEREF _Toc263191877 h 4 HYPERLINK l _Toc263191878 2.2.3加同余法 PAGEREF _Toc263191878 h 4 H
8、YPERLINK l _Toc263191879 2.3反馈位移寄存器法 PAGEREF _Toc263191879 h 4 HYPERLINK l _Toc263191880 三、伪均匀随机数的统计检验6 HYPERLINK l _Toc263191881 3.1 检验步骤6 HYPERLINK l _Toc263191882 3.2 检验统计量6 HYPERLINK l _Toc263191883 3.3 统计检验方法7 HYPERLINK l _Toc263191884 3.3.1参数检验7 HYPERLINK l _Toc263191885 3.3.2均匀性检验8 HYPERLINK
9、l _Toc263191886 3.3.3独立性检验10 HYPERLINK l _Toc263191887 3.3.4其他经验检验12 HYPERLINK l _Toc263191888 四、实例分析13 HYPERLINK l _Toc263191889 4.1 数据产生及录入13 HYPERLINK l _Toc263191890 4.2 参数检验-单样本t检验13 HYPERLINK l _Toc263191891 4.3均匀性检验-卡方检验14 HYPERLINK l _Toc263191892 4.4独立性检验16 HYPERLINK l _Toc263191893 4.5本章小结
10、18 HYPERLINK l _Toc263191888 五、结论19 HYPERLINK l _Toc263191894 参考文献20 HYPERLINK l _Toc263191895 附录21一、引言在科学研究和工程设计中广泛应用到计算机模拟方法,从而常常需要产生大量的具有特定统计性质的随机数。这种随机数通常是由计算机以某种数学方法产生,他们实质上是完全确定的,但可以满足一定的统计特征,故也称为伪随机数。而如何产生达到统计要求的随机数,则有不同的方法:硬件方法和软件方法。硬件方法可以在计算机上附上一个硬件设备或者采用移位寄存器来产生伪随机数;软件方法一般都采用数学公式法。至今关于随机数发
11、生器有很多的理论和方法,其中除了传统的Fibonacci法、平方取中法、线性同余法、位移寄存器法和组合方法外,最近还有非线性同余法、取小数法、进位加和错位减法、广义反馈位移寄存器法等等。尽管这个领域己经有很多的理论研究,但是仍存在很多的实际问题,甚至最近提出的随机数发生器也有一些缺点。近年来在计算机中,比较广泛使用的方法就是同余法,而在高级程序设计语言中常采用线性同余法。每次生成的伪随机数需要满足独立的条件及给定分布函数的要求,但高级程序设计语言中提供的库函数产生的伪随机数都是满足一定条件的均匀分布随机数,且在同一次程序运行中,每次产生的伪随机数是完全相同的。通过在微机上对用乘同余法和混合同余
12、法产生的随机数进行大量的试验, 发现通过适当选择算法中的各常量, 用这两种方法产生的随机数,其分布特性一般容易通过统计捡验。用随机模拟方法解决实际问题时,首先要清楚随机数的产生方法,或者说是随机变量的抽样方法。1基本概念和定理 定义1: 设随机变量,则称随机变量随机抽样序列为分布的随机数。 若,则称来自的随机抽样序列为正态分布随机数;若服从指数分布,则称为指数分布的随机数;若区间均匀分布,则称为区间上的均匀分布随机数。 定理1 设是连续且严格单调上升的分布函数,它的反函数存在,且记为即。若随机变量的分布函数为,则。若随机变量,则的分布函数为。推论 已知,设是一个分布函数,且反函数存在,则。 定
13、理2:设服从二点分布相互独立,且令 =+(用二进制表示) 则定义2:(准均匀分布) 设离散随机变量的概率密度为: 则称为准均匀分布,且。2 伪随机数显然,用计算机只能产生准均匀随机分布数,但是当很大时,和均匀随机变量的统计性质差异很小,可以把准均匀随机数做伪均匀随机数。二、产生随机数的一般方法2.1 取中法2.1.1 平方取中法平方取中法又称自然取中法,首先由Von Neuman于1940年提出, 此法开始取一个 2 位十进制整数作为种子,将其平方得到的一个4位数(不足4位的高位补0),然后取该4位中间 2位作为下一种子数,并对此数进行规格化(化成小于1的2位的实数值),依上述过程类推便得到一
14、维随机数列。其一般的递推公式是:的中间2位数字;按此公式依次得到一列数据,然后把这列数据的每一个元素都除以 ,可得到0,1区间上均匀分布的随机数列。2.1.2乘积取中法乘积取中法是通过平方取中法改进得到的一种产生随机数的方法,其一般递推公式为:式中:第 n+1 个十进制的正整数;第 n+1 个伪随机数。 此方法虽然简单,但均匀性不好,且序列很快趋于零,其长度难以确定,故目前已很少使用。2.2 同余发生器该发生方法是目前应用最广泛的方法之一,通常我们把它简称为LCG(Linear Congruence Generator)方法,它是由 Lehmer 在1951年提出的。此方法是利用数论中的同余运
15、算来产生随机数的,故称之为同余发生器。LCG 方法的一般递推公式为: 其中初值为,为模数,为乘子(乘数),为增量(加数),且,均为非负整数。显然由上式得到的(=1,2,)满足:。从而。当然,递推公式中的参数,的选择十分关键。否则,进行了一定次数的迭代之后会出现短周期的重复现象,因而我们应慎重选取。当参数,选择不同时,对应的方法会有稍稍的不同,具体的讨论如下:2.2.1混合同余法当上面的式中参数0,1时,则称之为混合同余法,或者称为混合式LCG。2.2.2乘同余法 当式中=0时的LCG方法称为乘同余法,或是积式发生器。具体表示式如下: ,初值为。2.2.3加同余法当式中时,称之为加同余法。具体表
16、示式为:,初值为虽说此方法可于以达到最大的周期,而且计算机实现比较方便。但是和上面的混合同余法、乘同余法对比,验证得出:该方法得到的随机数列性质相对较差。所以,一般常用的是混合同余法和乘同余法。2.3反馈位移寄存器法随着 LCG 方法的应用,人们渐渐发现其缺陷并开始寻找新的随机数发生方法。因此,通过大家的努力,在1965年以 Tausworthe 的相关论文为基础,出现了几种比较好的随机数发生器。它的主要原理是通过对寄存器进行位移,直接在存储单元中形成随机数。我们称这种方法为反馈位移寄存器法(Feedback Shift Register Methods),简称之为 FSR 方法。其线性递推公
17、式为: 其中为给定正整数,或为给定的常数。1971年,Toot hill、Robinson 和 Adams 又给出了 FSR 的另一递推公式: 其中是次数小于的且系数为0或1的多项式。而且0为正整数。三、伪均匀随机数的统计检验伪均匀随机数的有效性在于它们与真正的区间上均匀随机数的性质是否有显著差异。这是一个重要的问题。因为二者若有显著差异,这时以这种随机数发生器产生的随机数为基础的随机变量所得到的样本就不能够反映该随机变量的性质,从而无法得到可靠的随机模拟结果。因此随机数发生器的检验是一项很重要的工作。一般情况下,会有两种不同的检验方法:经验检验和理论检验。经验检验是一种统计检验,它是以发生器
18、产生的均匀随机数序列为基础的,根据区间上均匀总体简单随机样本的性质,如特征向量、均匀性、随机性等,研究我们产生的随机序列的相应性质,进行比较、借鉴、视其差异是否显著决定取舍。理论检验从统计意义上说并不是一种检验,它用一种综合的方法来评估发生器的参数值,而根本不必产生任何随机数序列,即它只是一种理论上的研究。由于理论检验方法需要专门学科的知识,数学上又相当难,我们这里只讨论经验检验的几种方法,通常称为统计检验。3.1 检验步骤首先假设总体具有某种统计特性,然后由样本值检验这个假设是否可信,此法又称假设检验,具体步骤如下:提出假设:总体分布为;选取适当的统计量,其中是样本,并求出在成立时的分布;给
19、定显著水平,确定检验方法,即给出否定域:使得 由观测值(样本值)计算值;做统计判断,当时否定;当时,相容。3.2 检验统计量 根据中心极限定理得到近似正态分布统计量设是相互独立同分布,且,记=,则以为极限分布。统计量将总体的简单子样按一定规则分为互不相交的个组,记第组的观测频数为,若随机变量属于第组的概率为,记理论频数,由构造统计量渐进服从,其中是附加在概率分布上独立约束条件的个数即确定概率时利用样本估计总体参数的个数,当时,。3.3 统计检验方法3.3.1参数检验均匀随机数的参数检验是检验由某个发生器产生的随机数序列的均值、方差和各阶矩阵等与均匀分布的理论值是否有显著差异。若随机变量,则若是
20、均匀总体的简单随机样本,即相互独立同分布,记,。则有: ;。设是某个发生器产生的随机数,首先对特征量作统计检验。在是均匀总体的简单随机样本的假设下,统计量 渐进服从。给定显著性水平后,查标准正态数值表得:(),否定域。由随机数序列计算的值,若,则认为产生的随机数序列的特征向量与均匀总体的特征量没有显著差异;否则,由于的特征量与均匀总体的特征量有显著差异,故不能认为是均匀总体的简单样本。我们用SPSS做参数检验时用单样本t检验。单样本t检验的目的是利用来自某总体的样本数据,推断该样本的均值是否与指定的检验值之间存在显著差异。它是对总体均值的假设检验。单样本t检验的原假设为:总体均值与检验值之间不
21、存在显著差异,表述为:,为总体均值,为检验值。对单个总体均值的推断是建立在单个样本均值基础上的,也就是希望利用样本均值去估计总体均值。构造t检验统计量为:,其中为样本方差。式中,t统计量服从n-1个自由度的t分布。SPSS将自动计算出t统计量的观测值和对应的概率P-值。给定显著性水平,与检验统计量的概率P-值比较。若概率P-值小于显著性水平,则应拒绝原假设,认为总体均值与检验值之间存在显著差异;反之,则不应拒绝原假设,认为总体均值与检验值之间无显著差异。3.3.2均匀性检验 随机数的均匀检验又称为频率检验,它用来检验由某个发生器产生的随机数序列是否均匀的分布在区间上。也就是检验经验频率与理论频
22、率的差异是否显著。 检验 卡方检验基本思想的理论依据是:如果从一个随机变量中随机抽取若干个观察样本,这些观察样本落在的个互不相交的子集中的观察频数服从一个多项分布,这个多项分布在趋向于无穷时近似服从卡方分布。设使待检验的一组随机数,假设:为均匀总体的简单样本。 将区间分为个小区间,以表示第个小区间,设落入第个小区间的数目为。 根据均匀性假设,落入每个小区间的概率为,第个小区间的理论频数,统计量渐进服从,给定显著性水平,查分布表得临界值后,即可对经验频率与理论频率的差异作显著性检验。若的概率P-值小于显著性水平,则应拒绝原假设,认为样本来自的总体分布与期望分布或某一理论分布存在显著差异;反之,则
23、不能拒绝原假设,可以认为样本来自的总体分布与期望分布或某一理论分布不存在显著差异。K-S检验(柯氏检验)K-S(柯尔莫哥洛夫-斯米尔诺夫)检验的原假设是:样本来自的总体与指定的理论分布无显著差异。其基本思路是:首先,在原假设成立的前提下,计算各样本观测值在理论分布中出现的累计概率值;其次,计算各样本观测值的实际累计概率值;计算实际累计概率值与理论累计概率值的差;最后,计算差值序列中最大绝对差值,即。统计量也称为K-S统计量。在小样本下,原假设成立时,统计量服从柯氏分布。在大样本下,原假设成立时,近似服从分布:当小于0时,为0;当大于0时,=若统计量的概率P-值小于显著性水平,则应拒绝原假设,认
24、为样本来自的总体分布与给定的分布存在显著差异;反之,则不能拒绝原假设,可以认为样本来自的总体分布与给定的分布不存在显著差异。 序列检验(Serial test)序列检验实际上是用于多维分布的均匀性检验,它也间接地检验序列的独立性。已知随机数序列,将容量为的随机数一次配对为: 如果是均匀随机数序列,那么他们应该构成平面上正方形内的二维均匀随机向量的样本。将单位正方形分成个等面积的小正方形,表示落入第个小正方形的频数;理论频数。则检验统计量在为均匀分布的独立抽样序列成历史渐进的服从。以上二维的序列检验可以推广到三维、四维直至一般的维。即对依次用不相交的阶组合:,它们应该是在单位维超立方体中均匀分布
25、的独立随机样本。把区间分为个相等的小区间,相应地把单位维超立方体分成个小立方体,用表示落入第个超立方体的个数。统计量渐进服从。这种维均匀分布的检验(序列检验)间接地检验了的独立性。3.3.3独立性检验 独立性检验主要检验随机数序列之间的统计相关性是否显著。它通常包括以下几种检验方法: 相关系数检验 两个随机变量的相关系数反映它们之间线性相关程度,若两个随机变量独立,则它们的相关系数必为零(反之不一定),故可以利用相关系数检验随机数的独立性。设是待检验的一组随机数,原假设:相关系数。考虑样本的阶自相关系数 相关系数范围为:,当时,表示变量的线性相关性较弱。SPSS将自动计算自相关系数及标准误差,
26、概率P-值,若检验统计量的概率P-值小于给定的显著性水平,应拒绝原假设,认为变量存在线性相关性;若相反,则不应拒绝原假设,认为变量间不存在线性相关性。当充分大,且成立时,渐进服从分布。利用统计量可以进行相关性检验。 相关系数检验 另外,的阶自相关系数还可以定义为: 其中,。 记,则可以证明:,这时检验假设可以用检验假设来代替。统计检验量为:利用统计量可进行相关性检验。 列联表检验在平面上,将单位正方形分成个相等的小正方形,把个随机数按先后顺序两两分组,例如取:,其中,为大于1的正数。记这些数对落入第个小正方形内的数目为令:, 用表示落入第个小正方形内的概率。当独立性假设成立时, 其中,表示随机
27、数落入第列的概率,表示落入第行的概率。用最大似然法可得: 检验统计量:渐进服从,其中是用样本来估计的个数,故,所以。3.3.4其他经验检验如最值检验,最值检验主要是检验伪均匀随机数序列的最大值和最小值。四、实例分析 本文利用Matlab中的Rand函数来产生随机数序列并运用作者学过的SPSS统计软件对随机数序列做统计检验。4.1 数据产生及录入打开Matlab,在工作窗口输入指令:shuju=1*rand(1000,1)+0,点击“Enter”即得到1000个数据。而由于SPSS无法直接读取MATLAB data file格式的数据,因此我们先将产生的随机数导入一个电子表格中,命名为“shuj
28、u”这样,SPSS就可以直接读取了,步骤为:选择菜单【File】-【Open】-【Data】,选择数据文件的类型“.xls”,并输入文件名“shuju”,出现下图: 我们默认将Excel工作表中的全部数据读入,直接点击“ok”。得到界面如下: 4.2 参数检验-单样本t检验单样本t检验在本例中的原假设可以表述为:=0.5。操作步骤:选择菜单【Analyze】-【Compare Means】-【One-samples T Test】出现如下图所示的窗口:将数据选择到【Test Variable(s)】,并将【Test Value】中的0改为0.5,点击“ok”,得到以下结果:由第一张表可知:Ma
29、tlab产生的1000个01之间的随机数的均值是0.51723,标准差是0.28536,均值标准误差是0.09024。从第二张表我们看到这组数的t统计量的观测值是1.909,自由度为999,t统计量的双尾概率P值是0.057,显然P (=0.05),则不应拒绝原假设,即认为总体均值与检验值之间无显著差异:样本均值与检验值的差是0.01723(它除以均值标准误差0.09024后得到t统计量的观测值),最后两列是总体均值与原假设值差的95%的置信区间为(-0.00048,0.03494),由此计算出总体均值的95%的置信区间为(0.49952,0.53494),这表示我们有95%的把握认为总体均值
30、在0.499520.53494之间,0.5包含在这个区间内,这也证明了总体均值与检验值之间无显著差异。4.3均匀性检验-卡方检验本例中卡方检验的原假设可以表述为:样本数据的分布与(0,1)上的均匀分布无显著差异。但在做卡方检验之前,需要将数据分组。我们将这1000个数据分为十组,即各组为:00.10000、0.100010.20000、0.200010.30000、0.900011。操作步骤如下:选择菜单【Tansform】-【Recode】-【Into Different Variables】,选择分组变量到【Numeric Variable-Output】框中,在【Output Varia
31、ble】框中的【Name】后输入存放分组结果的变量名,并按“change”确认。也可在【Lable】后输入相应的变量名标签,再按“Old and New values”按钮进行分组区间的定义。如下图:然后进行卡方检验。操作步骤如下:选择菜单【Analyze】-【Nonparametric Tests】-【Chi-Square】,出现如下窗口:选择待检验的变量到【Test Variable List】框中。在【Expected Values】框中给出理论值,我们默认为“All categories equal”(即表示所有子集的频数都相等)。得到下表:第一个表的第二列是指每组的频数,第三列是理论
32、频数,第四列是实际频数与理论频数的差;第二个表是计算的卡方统计量以及对应的概率P-值,若选择的显著水平是0.05,由于概率P-值大于,表示实际分布与理论分布无显著差异,即数据是均匀的分布在各个区间上的。同时,我们也可以对数据进行频数分析,绘制出条形图和圆饼图: 从图形中,我们更直观的看到数据分布接近均匀。4.4独立性检验本例中相关系数检验的原假设可以表述为:相关系数=0。操作步骤如下:选择菜单【Graphs】-【Time Series】-【Autocorrelations】选择变量到【Variables】,如下图所示:点击【Options】对话框,选择最大滞后数16,得到下图:从两张表中可以看
33、出,随机数序列的自相关系数和偏自相关系数几乎为零。设定显著性水平=0.05,从表中看出:概率P-值大于显著性水平,因此不应拒绝的原假设,认为变量无线性相关性。偏自相关系数接近于0,同时从图中也可以看出,随机数序列分布是很平稳的。因此可以断定变量是独立的。4.5本章小结笔者在本章利用SPSS统计软件对生成的0,1上的随机数进行了统计检验,包括参数检验,均匀性检验,独立性检验。笔者用Matlab生成的0,1上的伪均匀随机数基本通过上述检验,即所生成的数据序列具有均匀随机数的统计特性。五、结论随着计算机技术的飞速发展,随机数发生器的类型也越来越多,人们也越来越重视随机数发生器的性能。理论研究者们从理
34、论方面对随机数发生器给出了严格的验证。而应用学者认为纯粹在理论方面的研究并不合理,于是他们给出了更为严格的统计检验方法。随机数发生器的好坏毕竟很难判断,又由于它在不同领域的用途不尽相同,因此不同领域的人已经建立了各自的均匀随机数定义。比如,密码学研究者主要考虑产生的密码的安全性、可靠性,因此他们从两个方面考虑随机数序列,即一要求随机数序列有极大的周期;二要求随机数序列没有任何可推断的规律。这一方面他们给出了严格的定义。本文给出了随机数的基本概念和定理,并给出生成随机数的一般方法,及其统计检验方法。另外,笔者以一组随机数序列为例,利用SPSS给出了具体的统计检验的详细步骤,可供参考。笔者在设计本
35、论文时,虽力求完美,但由于时间仓促、精力有限,资料的查阅还不够全面,因此对于随机数发生器的应用方面和理论检验涉及较少。 附录资料:不需要的可以自行删除 C语言图形模式速成第一节 图形模式的初始化Turbo C 提供了非常丰富的图形函数,所有图形函数的原型均在graphics. h 中,本节主要介绍图形模式的初始化、独立图形程序的建立、基本图形功能、图形窗口以及图形模式下的文本输出等函数。另外,使用图形函数时要确保有显示器图形驱动程序*.BGI,同时将集成开发环境options/Linker中的Graphics lib选为on,只有这样才能保证正确使用图形函数。 不同的显示器适配器有不同的图形分
36、辨率。即是同一显示器适配器,在不同模式下也有不同分辨率。因此,在屏幕作图之前,必须根据显示器适配器种类将显示器设置成为某种图形模式,在未设置图形模式之前,微机系统默认屏幕为文本模式(80列,25行字符模式),此时所有图形函数均不能工作。设置屏幕为图形模式,可用下列图形初始化函数:void far initgraph(int far *gdriver, int far *gmode,char *path);其中gdriver和gmode分别表示图形驱动器和模式,path是指图形驱动程序所在的目录路径。有关图形驱动器、图形模式的符号常数及对应的分辨率见graphics. h。图形驱动程序由Turb
37、o C出版商提供,文件扩展名为.BGI。 根据不同的图形适配器有不同的图形驱动程序。例如对于EGA、 VGA 图形适配器就调用驱动程序EGAVGA.BGI。#include stdio.h#include graphics.hint main()int gdriver, gmode;gdriver=VGA;gmode=VGAHI;initgraph(&gdriver, &gmode, C:TC2.0BGI);bar3d(100, 100, 300, 250, 50, 1); /*画一长方体*/getch();closegraph();return 0;有时编程者并不知道所用的图形显示器适配器种
38、类,或者需要将编写的程序用于不同图形驱动器,Turbo C 提供了一个自动检测显示器硬件的函数,其调用格式为:void far detectgraph(int *gdriver, *gmode);其中gdriver和gmode的意义与上面相同。 自动进行硬件测试后进行图形初始化:#include stdio.h#include graphics.hint main()int gdriver, gmode;detectgraph(&gdriver, &gmode); /*自动测试硬件*/printf(the graphics driver is %d, mode is %dn,gdriver,g
39、mode); /*输出测试结果*/getch();initgraph(&gdriver, &gmode, C:TC2.0BGI);/* 根据测试结果初始化图形*/bar3d(100, 100, 300, 250, 50, 1); /*画一长方体*/getch();closegraph();return 0;上例程序中先对图形显示器自动检测,然后再用图形初始化函数进行初始化设置,但Turbo C提供了一种更简单的方法, 即用gdriver=DETECT 语句后再跟initgraph()函数就行了。采用这种方法后,上例可改为:#include stdio.h#include graphics.hi
40、nt main()int gdriver=DETECT, gmode;initgraph(&gdriver, &gmode, C:TC2.0BGI);bar3d(50, 50, 150, 30, 50, 1);getch();closegraph();return 0;另外,Turbo C 提供了退出图形状态的函数closegraph(),其调用格式为:void far closegraph(void);第二节 屏幕颜色的设置和清屏函数对于图形模式的屏幕颜色设置,同样分为背景色的设置和前景色的设置。在Turbo C中分别用下面两个函数: 设置背景色: void far setbkcolor(i
41、nt color);设置作图色: void far setcolor(int color);其中color 为图形方式下颜色的规定数值,对EGA,VGA显示器适配器,有关颜色的符号常数及数值见graphics.h。清除图形屏幕内容但不清除图形背景使用清屏函数,其调用格式如下: voide far cleardevice(void);#include stdio.h#include graphics.hint main()int gdriver, gmode, i,aa;gdriver=DETECT;initgraph(&gdriver, &gmode, C:TC2.0BGI); /*图形初始化
42、*/setbkcolor(0); /*设置图形背景*/cleardevice();for(i=0; i=15; i+)setcolor(i); /*设置不同作图色*/circle(320, 240, 20+i*10); /*画半径不同的圆*/getch();for(i=0; i=15; i+)setbkcolor(i); /*设置不同背景色*/cleardevice();circle(320, 240, 20+i*10);getch();aa=getmaxcolor();printf(maxcolor=%d,aa);getch();closegraph();return 0;另外,TURBO
43、C也提供了几个获得现行颜色设置情况的函数。 int far getbkcolor(void); 返回现行背景颜色值。int far getcolor(void); 返回现行作图颜色值。int far getmaxcolor(void); 返回最高可用的颜色值。第三节 基本画图函数基本图形函数包括画点,线以及其它一些基本图形的函数。本节对这些函数作一全面的介绍。 、画点. 画点函数 void far putpixel(int x, int y, int color); 该函数表示有指定的象元画一个按color 所确定颜色的点。对于颜色color的值可从表3中获得而对x, y是指图形象元的坐标。在
44、图形模式下,是按象元来定义坐标的。对VGA适配器,它的最高分辨率为640 x480,其中640为整个屏幕从左到右所有象元的个数,480为整个屏幕从上到下所有象元的个数。屏幕的左上角坐标为(0,0),右下角坐标为(639, 479),水平方向从左到右为x 轴正向,垂直方向从上到下为y轴正向。TURBO C的图形函数都是相对于图形屏幕坐标,即象元来说的。关于点的另外一个函数是: int far getpixel(int x, int y); 它获得当前点(x, y)的颜色值。 II、有关坐标位置的函数 int far getmaxx(void);返回x轴的最大值。int far getmaxy(v
45、oid);返回y轴的最大值。int far getx(void); 返回游标在x轴的位置。void far gety(void); 返回游标有y轴的位置。void far moveto(int x, int y); 移动游标到(x, y)点,不是画点,在移动过程中亦画点。void far moverel(int dx, int dy); 移动游标从现行位置(x, y)移动到(x+dx, y+dy)的位置,移动过程中不画点。、画线I. 画线函数TURBO C提供了一系列画线函数: void far line(int x0, int y0, int x1, int y1); 画一条从点(x0, y
46、0)到(x1, y1)的直线。void far lineto(int x, int y); 画一作从现行游标到点(x, y)的直线。void far linerel(int dx, int dy); 画一条从现行游标(x,y)到按相对增量确定的点(x+dx, y+dy)的直线。void far circle(int x, int y, int radius); 以(x, y)为圆心,radius为半径,画一个圆。void far arc(int x, int y, int stangle, int endangle,int radius); 以(x,y)为圆心,radius为半径,从stang
47、le开始到endangle结束(用度表示)画一段圆弧线。在TURBO C中规定x轴正向为0 度,逆时针方向旋转一周, 依次为90,180, 270和360度(其它有关函数也按此规定,不再重述)。 void ellipse(int x, int y, int stangle, int endangle,int xradius,int yradius);以(x, y)为中心,xradius,yradius为x轴和y轴半径,从角stangle 开始到endangle结束画一段椭圆线,当stangle=0,endangle=360时, 画出一个完整的椭圆。void far rectangle(int
48、x1, int y1, int x2, inty2); 以(x1, y1)为左上角,(x2, y2)为右下角画一个矩形框。 void far drawpoly(int numpoints, int far *polypoints); 画一个顶点数为numpoints,各顶点坐标由polypoints给出的多边形。polypoints整型数组必须至少有2 倍顶点数个无素。每一个顶点的坐标都定义为x,y,并且x在前。值得注意的是当画一个封闭的多边形时,numpoints 的值取实际多边形的顶点数加一,并且数组polypoints中第一个和最后一个点的坐标相同。下面举一个用drawpoly()函数画
49、箭头的例子。#include stdio.h#include graphics.hint main()int gdriver, gmode, i;int arw16=200,102,300,102,300,107,330,100,300,93,300,98,200,98,200,102;gdriver=DETECT;initgraph(&gdriver, &gmode, C:TC2.0BGI);setbkcolor(BLUE);cleardevice();setcolor(12); /*设置作图颜色*/drawpoly(8, arw); /*画一箭头*/getch();closegraph()
50、;return 0;II、设定线型函数在没有对线的特性进行设定之前,TURBO C 用其默认值,即一点宽的实线,但TURBO C 也提供了可以改变线型的函数。线型包括:宽度和形状。其中宽度只有两种选择:一点宽和三点宽。而线的形状则有五种。下面介绍有关线型的设置函数。void far setlinestyle(int linestyle,unsigned upattern,int thickness);该函数用来设置线的有关信息,其中linestyle是线形状的规定,见graphics.h。对于upattern,只有linestyle选USERBIT_LINE 时才有意义 (选其它线型,uppa
51、ttern取0即可)。此时uppattern的16位二进制数的每一位代表一个象元,如果那位为1,则该象元打开,否则该象元关闭。 void far getlinesettings(struct linesettingstypefar *lineinfo);该函数将有关线的信息存放到由lineinfo 指向的结构中,表中linesettingstype的结构如下:struct linesettingstypeint linestyle;unsigned upattern;int thickness;例如下面两句程序可以读出当前线的特性 struct linesettingstype *info;g
52、etlinesettings(info);void far setwritemode(int mode);该函数规定画线的方式。如果mode=0,则表示画线时将所画位置的原来信息覆盖了(这是TURBO C的默认方式)。如果mode=1, 则表示画线时用现在特性的线与所画之处原有的线进行异或(XOR)操作,实际上画出的线是原有线与现在规定的线进行异或后的结果。因此,当线的特性不变,进行两次画线操作相当于没有画线。有关线型设定和画线函数的例子如下所示。#include stdio.h#include graphics.hint main()int gdriver, gmode, i;gdriver
53、=DETECT;initgraph(&gdriver, &gmode, C:TC2.0BGI);setbkcolor(BLUE);cleardevice();setcolor(GREEN);circle(320, 240, 98);setlinestyle(0, 0, 3); /*设置三点宽实线*/setcolor(2);rectangle(220, 140, 420, 340);setcolor(WHITE);setlinestyle(4, 0 xaaaa, 1);/*设置一点宽用户定义线*/line(220, 240, 420, 240);line(320, 140, 320, 340);
54、getch();closegraph();return 0;第四节 基本图形的填充填充就是用规定的颜色和图模填满一个封闭图形。 一般是先画轮廓再填充。TURBO C提供了一些先画出基本图形轮廓, 再按规定图模和颜色填充整个封闭图形的函数。在没有改变填充方式时,TURBO C 以默认方式填充。 void far bar(int x1, int y1, int x2, int y2);确定一个以(x1,y1)为左上角,(x2,y2)为右下角的矩形窗口,再按规定图模和颜色填充。说明:此函数不画出边框,所以填充色为边框。void far bar3d(int x1, int y1, int x2, in
55、t y2,int depth,int topflag);当topflag为非0时, 画出一个三维的长方体。当topflag为0时,三维图形不封顶,实际上很少这样使用。说明: bar3d()函数中,长方体第三维的方向不随任何参数而变,即始终为45度的方向。void far pieslice(int x,int y,int stangle,int endangle,int radius);画一个以(x, y)为圆心,radius为半径,stangle为起始角度,endangle 为终止角度的扇形,再按规定方式填充。当stangle=0,endangle=360 时变成一个实心圆,并在圆内从圆点沿X
56、轴正向画一条半径。void far sector(int x, int y,int stanle,intendangle,int xradius, int yradius);画一个以(x, y)为圆心分别以xradius, yradius为x轴和y轴半径,stangle 为起始角,endangle为终止角的椭圆扇形,再按规定方式填充。第五节 设定填充方式TURBO C有四个与填充方式有关的函数。下面分别介绍: void far setfillstyle(int pattern, int color); color的值是当前屏幕图形模式时颜色的有效值。pattern的值及与其等价的符号常数见gr
57、aphics.h。除USER_FILL(用户定义填充式样)以外,其它填充式样均可由setfillstyle() 函数设置。当选用USER_FILL时,该函数对填充图模和颜色不作任何改变。 之所以定义USER_FILL主要因为在获得有关填充信息时用到此项。void far setfillpattern(char * upattern,int color); 设置用户定义的填充图模的颜色以供对封闭图形填充。其中upattern是一个指向8个字节的指针。这8个字节定义了8x8点阵的图形。每个字节的8位二进制数表示水平8点,8个字节表示8行,然后以此为模型向个封闭区域填充。void far getfi
58、llpattern(char * upattern); 该函数将用户定义的填充图模存入upattern指针指向的内存区域。void far getfillsetings(struct fillsettingstypefar * fillinfo); 获得现行图模的颜色并将存入结构指针变量fillinfo中。其中fillsettingstype结构定义如下:struct fillsettingstypeint pattern; /* 现行填充模式 * /int color; /* 现行填充模式 * /; 有关图形填充图模的颜色的选择,请看下面例程。#include stdio.h#include
59、 graphics.hmain()char str8=10,20,30,40,50,60,70,80; /*用户定义图模*/int gdriver,gmode,i;struct fillsettingstype save;/*定义一个用来存储填充信息的结构变量*/gdriver=DETECT;initgraph(&gdriver,&gmode,C:TC2.0BGI);setbkcolor(BLUE);cleardevice();for(i=0;i13;i+)setcolor(i+3);setfillstyle(i,2+i); /* 设置填充类型 */bar(100,150,200,50); /
60、*画矩形并填充*/bar3d(300,100,500,200,70,1); /* 画长方体并填充*/pieslice(200, 300, 90, 180, 90);/*画扇形并填充*/sector(500,300,180,270,200,100);/*画椭圆扇形并填充*/getch();cleardevice();setcolor(14);setfillpattern(str, RED);bar(100,150,200,50);bar3d(300,100,500,200,70,0);pieslice(200,300,0,360,90);sector(500,300,0,360,100,50);
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 高二地理教学设计:产业转型地区结构优化的机制与路径
- 高二地理选择性必修1教学设计:海绵城市建设与区域水安全保障
- 小学四年级综合实践活动《生命至上·科学避雷》主题班会教学设计
- 八年级数学《其他判定三角形全等条件》教学设计:AAS与HL模型的构建与迁移
- 掩膜版制造工保密意识考核试卷含答案
- 原料乳处理工班组考核考核试卷含答案
- 蒸煮熏烤制品加工工测试验证评优考核试卷含答案
- 铁合金焙烧操作工班组建设竞赛考核试卷含答案
- 石膏粉生产工安全风险水平考核试卷含答案
- 装饰美工基础管理竞赛考核试卷含答案
- 新版2026年部编版新教材道德与法治五年级上册全套单元、期中、期末检测题(共6份有答案)合集
- 2026年重庆市安全员A证考试模拟题及答案详解
- 2026-2027学年人教版八年级上册数学第一次月考重难点突破学情自测卷(含答案)
- 2026年公卫执业医师《医学微生物学》试题及答案
- 《美术手工创作方法》全套教学课件
- 人教版数学六年级上册第二单元测试卷(含解析)
- 雨课堂在线学堂《大学生国家安全教育》作业单元考核答案
- 铁路货车轮轴组装检修及管理规则
- 《概念验证服务规范》
- 酶工程与发酵工程创新创业项目商业计划书
- CJ/T 414-2012城市轨道交通钢铝复合导电轨技术要求
评论
0/150
提交评论