搜档网
当前位置:搜档网 › C#Random()函数详解

C#Random()函数详解

C#Random()函数详解
C#Random()函数详解

C#Random()函数详解

随机数的使用很普遍,可用它随机显示图片,用它防止无聊的人在论坛灌水还可以用来加密信息等等。本文讨论如何在一段数字区间内随机生成若干个互不相同的随机数,比如在从1到20间随机生成6个互不相同的整数,并通过此文介绍Visual c#中随机数的用法。

.net.Frameword中提供了一个专门产生随机数的类System.Random,此类默认情况下已被导入,编程过程中可以直接使用。我们知道,计算机并不能产生完全随机的数字,它生成的数字被称为伪随机数,它是以相同的概率从一组有限的数字中选取的,所选的数字并不具有完全的随机性,但就实用而言,其随机程度已经足够了。

我们可以用以下两种方法初始化一个随机数发生器;

函数是这样用,比如100至999的随机数

Random ran=new Random();

int RandKey=ran.Next(100,999);

不过这样会有重复,可以给Random一个系统时间做为参数,以此产生随机数,就不会重复了

第一种方法不指定随机种子,系统自动选取当前时前作随机种子:

Random ra=new Random();

第二种方法是指定一个int型的参数作为随机种子:

int iSeed=6;

Random ra=new Random(iSeed);

下面我们要用到Random.Next()方法产生随机数。

ra.Next();

它返回一个大于或等于零而小于2,147,483,647的数,这并不满足我们的需要,下面我们介绍它的重载函数和其它一些方法。

public virtual int Next(int);

用法:ra.next(20)

返回一个小于所指定最大值(此处为20)的正随机数。

public virtual int Next(int minValue, int maxValue);

用法:ra.next(1,20)

返回一个指定范围内(此处为1-20之间)的随机数,我们在下面的实例中会用到此函数。

类System.Random还有几个方法分别是:

公共方法:

NextBytes用随机数填充指定字节数组的元素。

NextDouble返回一个介于 0.0 和 1.0 之间的随机数。

受保护的方法:

Sample返回一个介于 0.0 和 1.0 之间的随机数,只允许子类对象访问。

以上介绍了随机数的基本用法,下面我们用一个实例来做更进一步的介绍。要在一段数字区间内随机生成若干个互不相同的随机数,比如在从1到20间随机生成6个互不相同的整数。

主要是下面两个函数getRandomNum与getNum:

public int[] getRandomNum(int num,int minValue,int maxValue)

{

Random ra=new Random(unchecked((int)DateTime.Now.Ticks));

int[] arrNum=new int[num];

int tmp=0;

for (int i=0;i<=num-1;i++){

tmp=ra.Next(minValue,maxValue); //随机取数

arrNum[i]=getNum(arrNum,tmp,minValue,maxValue,ra); //取出值赋到数组中

}

return arrNum;

}

getRandomNum即是在区间[minValue,maxValue]取出num个互不相同的随机数,返回的数组包含着结果。

其中随机数是这样创建的 Random ra=new Random(unchecked((int)DateTime.Now.Ticks));为什么不用Random ra=new Random();(系统自动选取当前时前作随机种子)呢?

用系统时间做随机种子并不保险,如果应用程序在一个较快的计算机上运行,则该计算机的系统时钟可能没有时间在此构造函数的调用之间进行更改,Random 的不同实例的种子值可能相同。这种情况下,我们就需要另外的算法来保证产生的数字的随机性。所以为了保证产生的随机数足够"随机",我们不得不使用复杂一点的方法来获得随机种子。在上面的这段程序中,我们首先使用系统时间作为随机种子,然后将上一次产生的随机数跟循环变量和一个与系统时间有关的整型参数相乘,以之作为随机种子,从而得到了每次都不同的随机种子,保证了产生足够"随机"的随机数。

函数getNum是一递归,用它来检测生成的随机数是否有重复,如果取出来的数字和已取得的数字有重复就重新随机获取。值得注意的是要用一同一个随机数实例生成,所以ra要作为参数传入getNum中,否则生成的数字会有重复。

public int getNum(int[] arrNum,int tmp,int minValue,int maxValue,Random ra){

int n=0;

while (n<=arrNum.Length-1)

{

if (arrNum[n]==tmp) //利用循环判断是否有重复

{

tmp=ra.Next(minValue,maxValue); //重新随机获取。

getNum(arrNum,tmp,minValue,maxValue,ra);//递归:如果取出来的数字和已取得的数字有重复就重新随机获取。

}

n++;

}

return tmp;

}

最后就是要显示出来,当点击一个button时取出的数字显示在一个label中。

private void button1_Click(object sender, System.EventArgs e)

{

int[] arr=getRandomNum(6,1,20); //从1至20中取出6个互不相同的随机数

int i=0;

string temp="";

while (i<=arr.Length-1){

temp+=arr[i].ToString()+"\n";

i++;

}

label1.Text=temp; //显示在label1中

}

开始是介绍一下random()函数和Math.random()函数,然后介绍一些由此引出的自定义函数.对于如何实战出一些效果,那需要想象的翅膀和其它AS基础的支持.而算法本身并不困难.最后我会介绍一个简单效果.希望能启发读者的思维.

Random.Next() 返回非负随机数;

Random.Next(Int) 返回一个小于所指定最大值的非负随机数

Random.Next(Int,Int) 返回一个指定范围内的随机数

1、random(number)函数介绍

见帮助文档,简单再提一下,random(number)返回一个0~number-1之间的随机整数.参数number代表

一个整数.

示例:

trace(random(5));

//复制到主场景第一帧.

2、Math.random()

见帮助文档。返回一个有14位精度的0~1之间的数,注意没有参数。听说MM是推荐用这个函数的,而不是上面那个.

示例:

trace(Math.random());

//复制到主场景第一帧.

3、自定义的函数

MM给我们的就这两个函数了,但是需求与供给总是存在矛盾。我们有时候需要的随机数可不是这么简单。

比如我们想返回一个有两位小数的随机数,返回两个数之间的随机数,返回字母随机数,返回多个随机数等等,

这些都需要我们自己编写函数来实现。下面的代码直接复制到主场景第一帧就可以调用了。注意有的函数需要入口参数。

# 返回一个共有n位数,其中m位是小数的随机数

function randomXiao(n,m){

var a = Math.pow(10, n+m);

var b = random(a);

return b=b/Math.pow(10, m);

}

可以用trace(randomXiao(3,2));实验一下。这个函数简单。Math.pow(n,m)用于返回一个以n为底,m为指数的数。乘方!

# 返回一个n到m之间的随机数

function randomNm(n,m){

if(m>=n){

return random(m-n+1)+n;

}

else {

return false;

}

}

之所以用random(m-n+1)是因为随机数的范围是m-n,加上1使得m也能在里面。加上n 保证随机数以n为下限。

加上判断使函数更完整。另外,如果要返回一个负数随机数,也可以用randomNm(n,0);当然,我想更一般的是用-random(n);

# 返回一个字母

function randomAscii(){

var c = String.fromCharCode(random(26)+65);

if(random(2)){

return c.toLowerCase();

return c;

}

返回一个不区分大小写的随机字母

如果要返回大写,把if条件句去掉就行了。如果要返回小写,可以把条件句改为恒成立,或者去掉条件,最后一句改为:

return c.toLowerCase(); String.fromCharCode(number)函数返回number代表数字的ASCII码。

toLowerCase()用于将大写字母转为小写。

# 返回一个n到m之间的k个互异随机数

function randomKdiffer(n,m,k){

arrayK = [];

var i = 0;

while (i < k) {

a = random(m-n+1)+n;

for (var j = 0; j < i; j++) {

if (a == arrayK[j]) {

break;

}

}

if (j == i) {

arrayK[i] = a;

i++;

}

}

return arrayK;

}

数组arrayK中的元素即为所得值。注意到我们借用了random(m-n+1)+n来返回一个n~m 的随机数。所以m本身也会被返回。

如果要返回m以内的数,可以把n值改为0。如果要随机返回不确定个数,可以把入口参数的K值赋为k=random(m-n);

随机返回不一定互异的数,把判断去掉就可以了,注意i++不要漏掉。这里不再给出。

#指定若干个字符/数字,然后从中随机返回一个(或多个)字符/数字,可以把原字符赋给一个数组,再根据数组的下标来

决定返回值。这里不再举出函数,大家可以自己尝试。

#另需指出,对于随机设定一个MC的颜色值,我们较多采用mcColor.setRBG(random(0xFFFFFF));下面的例子中会有说明。

如果要指定一个色域,可以采用上面给出的函数。如果对Color对象不太了解的可以查帮

助,这里不作讨论。

以上函数算是由random直接衍生的,下面再举个例子,可以说是衍生函数的衍生函数,其中会直接用到上面给出的函数,请注意。

#返回一个指定长度的随机大写英文字符串

function randomString(n){

var arrayA = randomKdiffer(1, 26, n);

var arrayB = "";

for (var i = 0; i < n; i++) {

c=String.fromCharCode(arrayA[i]+64);

/* if(random(2)){

c=c.toLowerCase();

}

*/

arrayB = arrayB+c;

}

return arrayB;

}

注意到StringCharCode方法,如果要写成小写,则把返回值写成arrayB.toLowerCase();如果返回一个不区分大小写的字符串,

则把注释去掉.如果要返回一个不指定长度的字符串,则可以把入口参数赋值为random(n);这样只指定其上限.此函数也可以用

randomAscii函数实现,留给大家自己思考.

#在几个区域中选出随机数

比如,在1~20,45~70这两段数之间选取一个随机数。因为区域数未定,所以直接用一个确定的函数编写多有不便,

我们要使用的方法就是用switch语句进行定向,具体的我们给出一个函数,返回一个1~20,45~70内的数,其它区域读者请自行更改。

function randomArea(){

var a=random(2);

switch(a){

case 0:

return randomNm(1,20);break;

case 1:

return randomNm(45,70);break;

}

}

注意,我们并没有写入口参数,而是直接在函数中就确定了是两段数,而且范围也是确定的。如果是三段,则改为a=random(3);

同样增加一个case就可以了。当然,你也可以把第段数的范围设为入口参数,这里就不再举例了。但是这样做可能会使参数增多,

我个人是不太喜欢一个需要很多参数的函数的。类似的,我们也可以随机返回一个字母段

或几个字母段或者字母加数字段的一个数。

方法也只是前几个函数的一个结合。这里仅举一例,返回指定的大写字母段的一个随机字母。

提醒一下,小写字母的ASCII码a~z分别对应97~122.

function randomAArea(a,b){

if (ord(a) <= ord(b) && 65<=ord(a) && ord(b) <= 90) {

return String.fromCharCode(randomNm(ord(a), ord(b)));

} else {

return false;

}

}

其中用到一个函数ord(char),这是一个不推荐的函数.用于返回char字符的ASCII码。

如果大家想在任何地方调用函数,则需要稍稍变一下,把我们写的函数改变为全局函数.这样就可以不用标明路径而自如地向调用系统

函数一样了.方法如下.例如:函数randomXiao如果要声明为全局函数,需要把第一行改为:

_global.randomXiao=function(n,m){

//statment

}

对全局函数的概念不很清楚的朋友不用被这个名词吓倒.

这样改了函数第一行之后,在任何地方,比如在一个MC里,直接用(对,直接用,不用加_root 路径了)randomXiao(n,m)就可以

Random类是一个产生伪随机数字的类,它的构造函数有两种,一个是直接New Random(),另外一个是New Random(Int32),前者是根据触发那刻的系统时间做为种子,来产生一个随机数字,后者可以自己设定触发的种子,一般都是用UnCheck((Int)DateTime.Now.Ticks)做为参数种子,因此如果计算机运行速度很快,如果触发Randm函数间隔时间很短,就有可能造成产生一样的随机数,因为伪随机的数字,在Random的内部产生机制中还是有一定规律的,并非是真正意义上的完全随机。

Random类产生随机数字的主要办法是Next(),Next(100)产生一个比100小的正整数,Next(1,100)在1到100中间产生一个随机数字,而利用Ticks(以100毫秒做基础单位的时间数量单位)来产生随机数,还是存在合理性的。

实验5 JAVA常用类

山西大学计算机与信息技术学院 实验报告 姓名学号专业班级 课程名称 Java实验实验日期成绩指导教师批改日期 实验5 JAVA常用类实验名称 一.实验目的: (1)掌握常用的String,StringBuffer(StringBuilder)类的构造方法的使用;(2)掌握字符串的比较方法,尤其equals方法和==比较的区别; (3)掌握String类常用方法的使用; (4)掌握字符串与字符数组和byte数组之间的转换方法; (5)Date,Math,PrintWriter,Scanner类的常用方法。 二.实验内容 1.二进制数转换为十六进制数(此程序参考例题249页9. 2.13) 程序源代码 import java.util.*; public class BinToHexConversion{ //二进制转化为十六进制的方法 public static String binToHex(String bin){ int temp; //二进制转化为十六进制的位数 if(bin.length()%4==0) temp = bin.length()/4; else temp = bin.length()/4 + 1; char []hex = new char[temp]; //十六进制数的字符形式 int []hexDec = new int[temp];//十六进制数的十进制数形式 int j = 0; for(int i=0;i=0&&dec<10) return (char)('0'+dec-0); else if(dec>=10&&dec<=15) return (char)('A'+dec-10); else return '@'; }

孙鑫深入详解MFC学习笔记

Windows编程 一、#define的几个注意点 ①#与##的用法; #xxx将后面的参数xxx字符串化 xxx##yyy,将两个参数连接 ②\的用法 一行结束使用,表示一行未结束。 二、函数调用约定_stdcall _stdcall是Pascal方式清理C方式压栈,通常用于Win32Api中,函数采用从右到左的压栈方式,堆栈由它自己清理。在win32应用程序里,宏APIENTRY,WINAPI,都表示_stdcall,非常常见。 相对应的_cdecl,堆栈由main()函数或者其他函数清理。 C和C++程序的缺省调用方式则为__cdecl,下图为VC++6.0的默认设置,因此在不显式写明调用约定的情况下,一般都是采用__cdecl方式,而在与Windows API打交道的场景下,通常都是显式的写明使用__stdcall,才能与Windows API保持一致。 另外,还要注意的是,如printf此类支持可变参数的函数,由于不知道调用者会传递多少个参数,也不知道会压多少个参数入栈,因此函数本身内部不可能清理堆栈,只能由调用者清理了。 三、防止头文件重复包含----预编译 在写好的类的首位加上预编译代码,例如: #ifndef xxx_h #define xxx_h Class xxx { ... }; #endif 四、HDC、CDC、CClientDC、CWindowDC HDC是平台SDK提供的全局类,与设备上下文相关 CDC则是类似于封装在CWnd中的一个HDC。 CClientDC:继承于CDC,构造函数完成获取DC,析构函数完成释放DC。 CWindowDC:继承于CDC,构造函数完成获取DC,析构函数完成释放DC,在整个窗口上绘图 CMetaFileDC:图元文件设备描述环境类 创建:CMetaFileDC dc; dc.Create(); 接下来用一般dc的绘图操作,绘图的内容均会保存至图元文件中; HMETAFILE m_hMetaFile=dc.Close();//图元文件赋予数据成员显示图元文件:用一般dc的PlayMetaFile(m_hMetaFile)显示图元文件 窗口销毁时删除图元文件 SDK函数::DeleteMetaFile(m_hMetaFile) 五、OnDraw函数、OnCreate函数 OnDraw函数:窗口重绘的时候被框架类FrameWnd调用,响应WM_PAINT消息。 OnCreate函数:窗口建立的时候调用的函数,响应WM_CREATE消息。

Proe中的常用函数关系

Proe中的部分函数关系 一、函数关系 sin 正弦Cos 余弦tan 正切asin 反正弦acos 反余弦atan 反正切sinh 双曲线余弦cosh 双曲线正弦tanh 双曲线正切spar 平方根exp e的幂方根abs 绝对值log 以10为底的对数ln 自然对数 ceil 不小于其值的最小整数floor 不超过其值的最大整数 二、齿轮公式 alpha=20 m=2 z=30 c=0.25 ha=1 db=m*z*cos(alpha) r=(db/2)/cos(t*50) theta=(180/pi)*tan(t*50)-t*50 z=0 三、蜗杆的公式da=8为蜗杆外径m=0.8 为模数angle=20压力角 L=30长度q直径系数d分度圆直径f齿根圆直径n实数

其中之间的关系 q=da/m-2 d=q*m df=(q-2.4)*m n=ceil(2*l/(pi*m)) 在可变剖面扫描的时候运用公式sd4=trajpar*360*n 在扫描切口的时候绘制此图形,其中红色的高的计算公式是sd5=pi*m/2 五、方向盘的公式sd4=sd6*(1-(sin(trajpar*360*36)+1)/8) 其中sd4是sd6的(3/4或者7/8),sin(trajpar*360*36的意思是转过360度且有36个振幅似的 六、凸轮的公式sd5=evalgraph("cam2",trajpar*360) r=150 theta=t*360 z=9*sin(10*t*360) 在方向按sin(10*t*360)的函数关系,9为高的9倍10为10个振幅似的 七、锥齿轮公式 m=4模数z =50齿轮齿数z-am=40与之啮合的齿轮齿数angle=20压力角b=30齿厚long分度圆锥角 d分度圆直径da齿顶圆直径df齿根圆直径db基圆直径关系:long=atan(z/z-am) d=m*z da=d+2*m*cos(long)

小白学Python笔记系列3.3.1 math库与random库

数学库及其使用 math库中常用的数学函数 函数数学表示含义 圆周率piππ的近似值,15位小数 自然常数e e e的近似值,15位小数 ceil(x) x 对浮点数向上取整 floor(x) x 对浮点数向下取整 pow(x,y)x y计算x的y次方 log(x)lg x以e为基的对数, log10(x)log10x以10为基的对数, sqrt(x)平方根 x

数学库及其使用 函数数学表示 含义exp(x)e的x次幂,degrees(x)将弧度值转换成角度radians(x)将角度值转换成弧度 sin(x)sin x 正弦函数cos(x)cos x 余弦函数tan(x)tan x 正切函数 asin(x)arcsin x 反正弦函数,x ?[-1.0,1.0]acos(x)arccos x 反余弦函数,x ?[-1.0,1.0]atan(x) arctan x 反正切函数,x ?[-1.0,1.0] math库中常用的数学函数

随机数库及其使用 random库中常用的函数 函数含义 seed(x)给随机数一个种子值,默认随机种子是系 统时钟 random()生成一个[0, 1.0)之间的随机小数 uniform(a,b)生成一个a到b之间的随机小数 randint(a,b)生成一个a到b之间的随机整数 randrange(a,b,c)随机生成一个从a开始到b以c递增的数 choice()从列表中随机返回一个元素 shuffle()将列表中元素随机打乱 sample(,k)从指定列表随机获取k个元素

随机数库及其使用 示例

JAVA中常用类的常用方法

JAVA屮常用类的常用方法 一.java?丨ang.Object 类 1、clone()方法 创建丼返M此对象的一个副木。要进行“克隆”的对象所属的类必须实现https://www.sodocs.net/doc/7b16558351.html,ng. Cloneable 接口。 2、equals(Objectobj)方法 0 功能:比较引用类型数据的等价性。 0 等价标准.?引用类型比较引用,基木类型比较值。 0 存在特例.?对File、String、Date及封装类等类型来说,是比较类型及对象的内稃而+ 考虑引用的是否为同一实例。 3、finalize〇方法 当垃圾丨"丨收器确定>(、存在对该对象的更多引用时,由对象的垃圾丨"丨收器调用此方法。 4、hashCode〇方法返 回该对象的哈希码值。 5、notify〇方法 唤醒在此对象监视器上等待的中?个线祝。 6、notifyAII〇方法 唤醒在此对象监视器上等待的所有线程= 7、toString()方法 返W该对象的字符串表示。在进行String与其它类型数据的连接操作时,&动调用tostringo 方法。可以根据耑要重写toStringO方法。 8、wait()方法 在其他线程调用此对象的n〇tify()方法或notifyAIIO方法前,异致当前线程等待。 二、字符串相关类 I String 类 charAt(int index)返回指定索引处的char值。compareTo{String anotherString)按字

典顺序比较两个字符串。compareTolgnoreCase(Stringstr)按字典顺序比较两个字 符串,不考虑人小写。concat(String str)将指定字符串连接到此字符串的结尾。 endsWith(String suffix)测试此字符串是否以指定的〗?缀结束。equals{Object anObject)将此字符串与指定的对象比较。 equalslgnoreCase(String anotherString)将此String 与另一个String 比较,考虑人小'与’。indexOf(int ch)返H指定字符在此字符串屮第一次出现处的索引。 indexOf(String str)返回第一次出现的指定子字符串在此字符串屮的索引, lastlndexOf(intch)返回指定字符在此字符串中最后??次出现处的索引。 length()返|n丨此字符串的长度。 replace(char oldChar, char newChar) 返回一个新的字符串,它是通过用newChar替换此字符串中出现的所有oldChar得到的。 split(String regex)根据给定正则表达式的匹配拆分此字符串。startsWith{String prefix)测试此字符 串是否以指定的前缀开始。substring(int beginlndex) 返回一个新的字符串,它是此字符串的一个子字符串。该子字符串始于指定索引处的字符,一直到此字符串末尾。 substring(int beginlndex, int endlndex) 返回一个新字符串,它是此字符串的一个子字符串。该子字符串从指定的beginlndex 处开始,一直到索引endlndex-1处的字符。 t〇CharArray()将此字符串转换为一个新的字符数组。

CRichEditCtrl

CRichEditCtrl MFC Library Reference Using CRichEditCtrl(https://www.sodocs.net/doc/7b16558351.html,/tie/7576199.html)rich edit控件是用户能够输入和编辑文本的窗口。文本能被指定字符和段落格式,并且也能包含嵌入式OLE对象。rich edit 控件在MFC中通过CRichEditCtrl类描绘。关于哪些你想知道更多?RichEdit控件概述 如果你在对话框中使用rich edit控件(不管你的程序是SDI,MDI,还是基本对话框),你必须在对话框显示之前调用AfxInitRichEdit一次。调用此函数的典型位置 在你的程序的InitInstance成员函数中。你不必每次显示对话框时调用它,仅仅第一次就可以了。如果你使用CRichEditView你不必调用 AfxInitRichEdit.Rich edit控件(CRichEditCtrl)为格式化文本提供程序接口。然而,一个程序必须实现任一用户接口组件,这个组件对于用户格式化操作可用是必要 的。那就是,Rich edit控件支持选定文本的字符或段落属性的改变。字符属性

的一些例子就是黑粗体,斜体,字体系列,和点大小。段落属性的例子如对齐,页边空白,和移字键 (英文原文:tab stops.表示在rich edit中按下tab键光标会移动一段距离)。然而,这是给你提供的用户接口,不管那是一个工具条按钮,菜单项,或是一个格式化字符对话框。也有函数对目 前选择查询richedit控件。使用这些函数显示当前属性设置,比如,设置一个选定标记在用户接口上,如果当前选择是黑粗体字符格式属性。参见CharacterFomatting和paragraph formatting查看更多字符段落格式化信息。rich edit控件支持几乎所有多行编辑控件( multiline edit controls)的操作和通知消息。因此,使用EDIT控件的应用程序很容易的变换为使用RICH EDIT控件。附加的消息和通知(notifications)能使程序访问richedit的其它特性。参看CEdit查看编辑控件消息。与rich edit控件有关的类 CRichEditView, CRichEditDoc, 和CRichEditCntrItem类提供在MFC的文档/视图结构环境内的RICH EDIT控件的功能。CRichEditView保持着文本和文本的格式化特性。CRichEditDoc保持着视图中OLE客户项的序列。CRichEditCntrItem提供对OLE客户项的container-side

随机振动(振动频谱)计算(Random Vibration)

Random Vibration 1. 定义 1.1 功率谱密度 当波的频谱密度乘以一个适当的系数后将得到每单位频率波携带的功率,这被称为信号的功率谱密度(power spectral density, PSD)。 功率谱密度谱是一种概率统计方法,是对随机变量均方值的量度。 1.2 均方根 均方根(RMS)是指将N项的平方和除于N后,开平方的结果。均方根值也是有效值,如对于220交流电,示波器显示的有效值或均方根值为220V。 2. 加速度功率谱密度 2.1 单位 加速度单位:m/s^2或g 加速度功率谱密度单位:(m/s^2)^2/Hz或g^2/Hz Hz单位为:1/s, 所以加速度功率谱密度单位也可写为:m^2/s^3 2.2功率谱密度函数 功率谱密度函数曲线的纵坐标是(g2/Hz)。功率谱曲线下的面积就是随机加速度的总方差(g2): σ2= ∫Φ(f)df 其中:Φ(f)........功率谱密度函数 σ ............. 均方根加速度 3. 计算示例 随机振动100-2000HZ,功率谱密度为0.01g^2/Hz,则其加速度峰值计算如下: σ2=0.01*(2000-100)=19 σ=4.36g 峰值加速度不大于3倍均方根加速度:13.08g

4、SAE J 1455 随机振动要求 4.1功率谱图 4.1.1 Vertical axis 4.1.2 Transverse axis 4.1.3 Longitudinal axis

4.2 Vertical axis加速度计算 功率谱曲线下的面积:σ2=(40-5)0.016+0.5*(500-40)*0.016=4.24σ=2.06g 峰值加速度不大于3倍均方根加速度:6.18g 5. FGE随机振动要求 5.1功率谱图

《网络程序设计》复习题

1、什么叫套接字?套接字按通信性质可以分为哪两类? 2、理解线程的创建与使用方法,并能应用到程序设计中。 3、异构环境下的网络程序设计需要考虑哪些问题? 4、为什么在数据结构struct sockaddr_in中,成员变量sin_addr和sin_port需要转换为网络字节顺序,而sin_family不需要呢? 5、从网络编程的角度来简述和比较IP地址和端口的作用。 6、为什么网络编程时需要考虑字节顺序问题? 7、WinSock编程中需要哪些文件? 8、UDP程序的工作模型隐含着通信标识五元组的建立过程。这五元组在UDP的客户与服务端是由哪些函数分别确定的? 9、什么是阻塞与非阻塞通信?请解释两者的区别。 10、简述各种类型数据的发送与接收处理的方法。 11、简述基于UDP的客户机/服务器端socket编程流程。 12、什么是通信三元组和五元组?三元组和五元组每个元素在网络连接中起到什么作用? 13、为什么服务端在TCP通信过程中需要调用bind( )函数而客户端不需要?为什么客户机通常不需要绑定自己的端口号? 14、简述套接字Select模型原理,以及select模型的优势和不足。 15、简述阻塞模式服务器和客户端工作流程,以及阻塞模式套接字的优势和不足。 16、在实际应用中,很多TCP服务器程序在非正常退出时,如果立即重启服务器进程则会发生绑定服务器端口失败的错误,从而无法启动服务器进程,但等待一段时间后就可以了。为什么会发生这种情况呢?如何解决这个问题(或采取什么措施可以立即重启服务器进程)?(要求掌握setsockopt()函数的用法) 17、TCP程序的工作模型隐含着通信标识五元组的建立过程。这五元组在TCP的客户与服务端是由哪些函数分别确定的? 18、accept( )为什么要返回一个套接口?或者说,为什么要为每一个连接创建一个套接口来处理?UDP 服务器端为什么不需要多个套接口? 19、理解生产者-消费者模型,理解线程的同步与互斥方法(event和critical-section),并能应用到程序设计中。 20、采用阻塞式I/O模型时,套接字函数recv()的返回值有哪几种?分别对应什么情况? 21、closesocket()函数和shutdown()函数有何差别? 22、什么是TCP的三次握手机制?为什么要使用TCP的三次握手机制? 23、服务器端并发的两种模型及编程实现。 考试形式:闭卷 考试时间:120分钟 考试题型:选择题(2’×10=20’)、简答题(10’×6=60’)、程序设计题(20’)

4:一个经典的多线程同步问题汇总

一个经典的多线程同步问题 程序描述: 主线程启动10个子线程并将表示子线程序号的变量地址作为参数传递给子线程。子线程接收参数 -> sleep(50) -> 全局变量++ -> sleep(0) -> 输出参数和全局变量。 要求: 1.子线程输出的线程序号不能重复。 2.全局变量的输出必须递增。 下面画了个简单的示意图: 分析下这个问题的考察点,主要考察点有二个: 1.主线程创建子线程并传入一个指向变量地址的指针作参数,由于线程启动须要花费一定的时间,所以在子线程根据这个指针访问并保存数据前,主线程应等待子线程保存完毕后才能改动该参数并启动下一个线程。这涉及到主线程与子线程之间的同步。 2.子线程之间会互斥的改动和输出全局变量。要求全局变量的输出必须递增。这涉及到各子线程间的互斥。 下面列出这个程序的基本框架,可以在此代码基础上进行修改和验证。 //经典线程同步互斥问题 #include #include #include long g_nNum; //全局资源 unsigned int__stdcall Fun(void *pPM); //线程函数 const int THREAD_NUM = 10; //子线程个数 int main() { g_nNum = 0;

HANDLE handle[THREAD_NUM]; int i = 0; while (i < THREAD_NUM) { handle[i] = (HANDLE)_beginthreadex(NULL, 0, Fun, &i, 0, NULL); i++;//等子线程接收到参数时主线程可能改变了这个i的值} //保证子线程已全部运行结束 WaitForMultipleObjects(THREAD_NUM, handle, TRUE, INFINITE); return 0; } unsigned int__stdcall Fun(void *pPM) { //由于创建线程是要一定的开销的,所以新线程并不能第一时间执行到这来int nThreadNum = *(int *)pPM; //子线程获取参数 Sleep(50);//some work should to do g_nNum++; //处理全局资源 Sleep(0);//some work should to do printf("线程编号为%d 全局资源值为%d\n", nThreadNum, g_nNum); return 0; } 运行结果:

高中常用函数性质及图像汇总

高中常用函数性质及图像 一次函数 (一)函数 1、确定函数定义域的方法: (1)关系式为整式时,函数定义域为全体实数; (2)关系式含有分式时,分式的分母不等于零; (3)关系式含有二次根式时,被开放方数大于等于零; (4)关系式中含有指数为零的式子时,底数不等于零; (5)实际问题中,函数定义域还要和实际情况相符合,使之有意义。 (二)一次函数 1、一次函数的定义 一般地,形如y kx b =+(k ,b 是常数,且0k ≠)的函数,叫做一次函数,其中x 是自变量。当0b =时,一次函数y kx =,又叫做正比例函数。 ⑴一次函数的解析式的形式是y kx b =+,要判断一个函数是否是一次函数,就是判断是否能化成以上形式. ⑵当0b =,0k ≠时,y kx =仍是一次函数. ⑶当0b =,0k =时,它不是一次函数. ⑷正比例函数是一次函数的特例,一次函数包括正比例函数. 2、正比例函数及性质 一般地,形如y=kx(k 是常数,k≠0)的函数叫做正比例函数,其中k 叫做比例系数. 注:正比例函数一般形式 y=kx (k 不为零) ① k 不为零 ② x 指数为1 ③ b 取零 当k>0时,直线y=kx 经过三、一象限,从左向右上升,即随x 的增大y 也增大;当k<0时,?直线y=kx 经过二、四象限,从左向右下降,即随x 增大y 反而减小. (1) 解析式:y=kx (k 是常数,k ≠0) (2) 必过点:(0,0)、(1,k ) (3) 走向:k>0时,图像经过一、三象限;k<0时,?图像经过二、四象限 (4) 增减性:k>0,y 随x 的增大而增大;k<0,y 随x 增大而减小 (5) 倾斜度:|k|越大,越接近y 轴;|k|越小,越接近x 轴 3、一次函数及性质 一般地,形如y=kx +b(k,b 是常数,k≠0),那么y 叫做x 的一次函数.当b=0时,y=kx +b 即y=kx ,所以说正比例函数是一种特殊的一次函数. 注:一次函数一般形式 y=kx+b (k 不为零) ① k 不为零 ②x 指数为1 ③ b 取任意实数 一次函数y=kx+b 的图象是经过(0,b )和(- k b ,0)两点的一条直线,我们称它为直线y=kx+b,它可以看作由直线y=kx 平移|b|个单位长度得到.(当b>0时,向上平移;当b<0时,向下平移)

java随机函数用法Random

java随机函数用法Random import java.util.Random; public class RandomNumber{ public static void main(String[] args) { // 使用https://www.sodocs.net/doc/7b16558351.html,ng.Math的random方法生成随机数System.out.println("Math.random(): " + Math.random()); // 使用不带参数的构造方法构造java.util.Random对象System.out.println("使用不带参数的构造方法构造的Random对象:"); Random rd1 = new Random(); // 产生各种类型的随机数 // 按均匀分布产生整数 System.out.println("int: " + rd1.nextInt()); // 按均匀分布产生长整数 System.out.println("long: " + rd1.nextLong()); // 按均匀分布产生大于等于0,小于1的float数[0, 1) System.out.println("float: " + rd1.nextFloat());

// 按均匀分布产生[0, 1)范围的double数 System.out.println("double: " + rd1.nextDouble()); // 按正态分布产生随机数 System.out.println("Gaussian: " + rd1.nextGaussian()); // 生成一系列随机数 System.out.print("随机整数序列:"); for (int i = 0; i < 5; i++) { System.out.print(rd1.nextInt() + " "); } System.out.println(); // 指定随机数产生的范围 System.out.print("[0,10)范围内随机整数序列: "); for (int i = 0; i < 10; i++) { // Random的nextInt(int n)方法返回一个[0, n)范围内的随机数 System.out.print(rd1.nextInt(10) + " "); } System.out.println(); System.out.print("[5,23)范围内随机整数序列: "); for (int i = 0; i < 10; i++) {

Matlab之print,fprint,fscanf,disp函数的用法

print: print函数可以把函数图形保存成图片: minbnd = -4*pi; maxbnd = 4*pi; t = minbnd:0.1*pi:maxbnd; plot(t, sin(t), 'g', 'Linewidth', 2); line([minbnd, maxbnd], [0, 0]); %绘制x轴 axis([-10, 10, -2, 2]) %定义显示的坐标区间:x在(-10,10)之间,y在(-2,2)之间 grid on; title('sin(x)'); xlabel('x'); ylabel('sin(x)'); print('-dpng','sin.png'); %保存为png图片,在Matlab当前的工作目录下 如下: 打开Matlab当前的工作目录下可以看到有sin.png图片了 print('-dpng', 'sin.png')表示保存为png图片,文件名为sin.png,其中第一个参数可以是: -dbmp:保存为bmp格式 -djpeg:保存为jpeg格式 -dpng:保存为png格式 -dpcx:保存为pcx格式 -dpdf:保存为pdf格式 -dtiff:保存为tiff格式

fprintf: fprintf函数可以将数据按指定格式写入到文本文件中: data = [5, 1, 2; 3, 7, 4]; [row, col] = size(data); for i=1:row for j=1:col fprintf('data(%d, %d) = %d\n', i, j, data(i, j)); %直接输出到屏幕;类似于C语言的输出格式end end fprintf(fid, format, data)中的fid表示由fopen函数打开的文件句柄,如果fid 省略,则直接输出在屏幕上,format是字符串形式的输出格式,data是要输出的数据。其中format可以为: %c 单个字符 %d 有符号十进制数(%i也可以) %u 无符号十进制数 %f 浮点数(%8.4f表示对浮点数取8位宽度,同时4位小数) %o 无符号八进制数 %s 字符串 %x 小写a-f的十六进制数 %X 大小a-f的十六进制数 输出到文件: data = [5, 1, 2; 3, 7, 4]; [row, col] = size(data); %求出矩阵data的行数和列数 %加t表示按Windows格式输出换行,即0xOD 0x0A,没有t表示按Linux格式输出换行,即0x0A fid=fopen('test.txt', 'wt'); %打开文件 for i=1:row

Java常用类库介绍

教学内容 第七讲Java常用类库介绍 7.1 Java类库的结构 类库就是Java API(Application Programming Interface,应用程序接口),是系统提供的已实现的标准类的集合。在程序设计中,合理和充分利用类库提供的类和接口,不仅可以完成字符串处理、绘图、网络应用、数学计算等多方面的工作,而且可以大大提高编程效率,使程序简练、易懂。 Java类库中的类和接口大多封装在特定的包里,每个包具有自己的功能。表7.1列出了Java中一些常用的包及其简要的功能。其中,包名后面带“. *”的表示其中包括一些相关的包。有关类的介绍和使用方法,Java中提供了极其完善的技术文档。我们只需了解技术文档的格式就能方便地查阅文档。 表7.1Java提供的部分常用包 注:在使用Java时,除了https://www.sodocs.net/doc/7b16558351.html,ng外,其他的包都需要import语句引入之后才能使用。 7.2 https://www.sodocs.net/doc/7b16558351.html,ng包中的常用类

https://www.sodocs.net/doc/7b16558351.html,ng是Java语言最广泛使用的包。它所包括的类是其他包的基础,由系统自动引入,程序中不必用import语句就可以使用其中的任何一个类。https://www.sodocs.net/doc/7b16558351.html,ng中所包含的类和接口对所有实际的Java程序都是必要的。下面我们将分别介绍几个常用的类。 7.2.1 String类和StringBuffer类 许多语言中,字符串是语言固有的基本数据类型。但在Java语言中字符串通过String类和StringBuffer类来处理。 1.String类 Java语言中的字符串属于String类。虽然有其它方法表示字符串(如字符数组),但Java使用String 类作为字符串的标准格式。Java编译器把字符串转换成String对象。String对象一旦被创建了,就不能被改变。如果需要进行大量的字符串操作,应该使用StringBuffer类或者字符数组,最终结果可以被转换成String格式。 (1)创建字符串 创建字符串的方法有多种方式,通常我们用String类的构造器来建立字符串。表6.2列出了String 类的构造器及其简要说明。 表7.2 String类构造器概要 【例7.1】使用多种方法创建一个字符串并输出字符串内容。 public class StrOutput { public static void main(Sring[] args) { //将字符串常量作为String对象对待,实际上是将一个String对象赋值给另一个 String s1 = "Hello,java!"; //声明一个字符串,然后为其赋值 String s2; s2 = "Hello,java!";

CSerialPort类解析

CserialPort类的功能及成员函数介绍 CserialPort类是免费提供的串口类,Codeguru是一个非常不错的源代码网站CserialPort类支持线连接(非MODEM)的串口编程操作。 CserialPort类是基于多线程的,其工作流程如下:首先设置好串口参数,再开启串口检测工作线程,串口检测工作线程检测到串口接收到的数据、流控制事件或其他串口事件后,就以消息方式通知主程序,激发消息处理函数来进行数据处理,这是对接受数据而言的,发送数据可直接向串口发送。 介绍几个经常用到的函数: 1、串口初始化函数InitPort 这个函数是用来初始化串口的,即设置串口的通信参数:需要打开的串口号、波特率、奇偶校验方式、数据位、停止位,这里还可以用来进行事件的设定。如果串口初始化成功,就返回TRUE,若串口被其他设备占用、不存在或存在其他股占,就返回FALSE,编程者可以在这儿提示串口操作是否成功如果在当前主串口调用这个函数,那么pPortOwner可用this指针表示,串口号在函数中做了限制,只能用1,2,3和4四个串口号,而事实上在编程时可能用到更多串口号,可以通过通过注释掉本函数中“assert(portur>0&&portnr<5)”语句取消对串口号的限制。 if (m_ComPort[0].InitPort(this,1,9600,'N',8,1,EV_RXFLAG | EV_RXCHAR,512)) //portnr=1(2),baud=9600,parity='N',databits=8,stopsbits=1,

//dwCommEvents=EV_RXCHAR|EV_RXFLAG,nBufferSize=512 { m_ComPort[0].StartMonitoring(); //启动串口监视线程 SetTimer(1,1000,NULL); //设置定时器,1秒后发送数据} e lse { CString str; str.Format("COM1 没有发现,或被其它设备占用"); AfxMessageBox(str); } 2、启动串口通信监测线程函数StartMonitoring() 串口初始化成功后,就可以调用BOOL StartMonitoring()来启动串口检测线程,线程启动成功,返回TRUE。 BOOL CSerialPort::StartMonitoring() { if (!(m_Thread = AfxBeginThread(CommThread, this))) return FALSE; TRACE("Thread started\n"); return TRUE; } 注意这个函数一旦调用,就会建立一个线程,这个线程一直不会结束,调用StopMonitoring ()只是将这个线程挂起。 3、暂停或停止监测线程函数StopMonitoring() 该函数暂停或停止串口检测,要注意的是,调用该函数后,串口资源仍然被占用 // // Suspend the comm thread // BOOL CSerialPort::StopMonitoring() { TRACE("Thread suspended\n"); m_Thread->SuspendThread(); return TRUE; } 4、关闭串口函数ClosePort() 该函数功能是关闭串口,释放串口资源,调用该函数后,如果要继续使用串口,还需要调用InitPort()函数。 这里有一个问题,在以前的版本中,如果调用了StartMonitoring函数,关闭串口后,再打开就会出现问题,及网上所说的关闭死锁问题。找了大量资料后,

引用java中随机函数的使用

引用java中随机函数的使用 引用 axunlb的java中随机函数的使用 java中随机函数的使用 Random N = new Random(1000);中的1000产生的随机数在0到1000之间,参数用于指定随机数产生的范围 方法1 (数据类型)(最小值+m()*(最大值-最小值+1)) 例: (int)(1+m()*(10-1+1)) 从1到10的int型随数 方法2 获得随机数 for (int i=0;i<30;i++) {.println((int)(1+m()*10));} (int)(1+m()*10) 通过包的random方法得到1-10的int随机数 公式是:最小值---最大值(整数)的随机数

(类型)最小值+m()*最大值 方法3 Random ra =new Random(); for (int i=0;i<30;i++) {.println(ra.nextInt(10)+1);} 通过包中的Random类的nextInt方法来得到1-10的int随机数import .*; class Test { public static void main(String args[]) { int[] t = new int[10]; Random rand = new Random(); for(int i=0;i

} } } java中Random的构造函数Random()中默认的种子就是当前时间和midnight, January 1, 1970 UTC的差值(用毫秒计),所以每次运行程序都可以得到不同的结果nt()也可以如此用r.nextInt(100)—–100以内的随机数

JAVA中常用类的常用方法

JAVA中常用类的常用方法 一、类 1、clone()方法 创建并返回此对象的一个副本。要进行“克隆”的对象所属的类必须实现. Cloneable接口。 2、equals(Object obj)方法 功能:比较引用类型数据的等价性。 等价标准:引用类型比较引用,基本类型比较值。 存在特例:对File、String、Date及封装类等类型来说,是比较类型及对象的内容而不考虑引用的是否为同一实例。 3、finalize()方法 当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。 4、hashCode()方法返回该对象的哈希码值。 5、notify()方法唤醒在此对象监视器上等待的单个线程。 6、notifyAll()方法唤醒在此对象监视器上等待的所有线程。 7、toString()方法 返回该对象的字符串表示。在进行String与其它类型数据的连接操作时,自动调用toString()方法。可以根据需要重写toString()方法。 8、wait()方法 在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前,导致当前线程等待。

二、字符串相关类 l String类 charAt(int index) 返回指定索引处的 char 值。 compareTo(String anotherString) 按字典顺序比较两个字符串。compareToIgnoreCase(String str) 按字典顺序比较两个字符串,不考虑大小写。concat(String str) 将指定字符串连接到此字符串的结尾。 endsWith(String suffix) 测试此字符串是否以指定的后缀结束。 equals(Object anObject) 将此字符串与指定的对象比较。 equalsIgnoreCase(String anotherString) 将此 String 与另一个 String 比较,不考虑大小写。 indexOf(int ch) 返回指定字符在此字符串中第一次出现处的索引。 indexOf(String str) 返回第一次出现的指定子字符串在此字符串中的索引。lastIndexOf(int ch) 返回指定字符在此字符串中最后一次出现处的索引。length() 返回此字符串的长度。 replace(char oldChar, char newChar) 返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 得到的。 split(String regex) 根据给定正则表达式的匹配拆分此字符串。 startsWith(String prefix) 测试此字符串是否以指定的前缀开始。 substring(int beginIndex) 返回一个新的字符串,它是此字符串的一个子字符串。该子字符串始于指定索引处的字符,一直到此字符串末尾。

C多线程编程实例实战

C#多线程编程实例实战 问题的提出 所谓单个写入程序/ 多个阅读程序的线程同步问题,是指任意数量的线程访问共享资源时,写入程序(线程)需要修改共享资源,而阅读程序(线程)需要读取数据。在这个同步问题中,很容易得到下面二个要求: 1 )当一个线程正在写入数据时,其他线程不能写,也不能读。 2 )当一个线程正在读入数据时,其他线程不能写,但能够读。在数据库应 用程序环境中经常遇到这样的问题。比如说,有n 个最终 用户,他们都要同时访问同一个数据库。其中有m个用户要将数据存入数据库,n-m 个用户要读取数据库中的记录。 很显然,在这个环境中,我们不能让两个或两个以上的用户同时更新同一条记录,如果两个或两个以上的用户都试图同时修改同一记录,那么该记录中的信息就会被破坏。 我们也不让一个用户更新数据库记录的同时,让另一用户读取记录的内容。因为读取的记录很有可能同时包含了更新和没有更新的信息,也就是说这条记录是无效的记录。 实现分析 规定任一线程要对资源进行写或读操作前必须申请锁。根据操作的不同,分为阅读锁和写入锁,操作完成之后应释放相应的锁。将单个写入程序/ 多个阅读程序的要求改变一下,可以得到如下的形式: 一个线程申请阅读锁的成功条件是:当前没有活动的写入线程。 一个线程申请写入锁的成功条件是:当前没有任何活动(对锁而言)

的线程 因此,为了标志是否有活动的线程,以及是写入还是阅读线程,引入一个变量m_nActive ,如果m_nActive > 0 ,则表示当前活动阅读线程的数目,如果 m_nActive=0 ,则表示没有任何活动线程,m_nActive <0 ,表示当前有写入线程在活动,注意m_nActive<0 ,时只能取-1 的值,因为只允许有一个写入线程活动。 为了判断当前活动线程拥有的锁的类型,我们采用了线程局部存储技术(请参阅其它参考书籍) ,将线程与特殊标志位关联起来。 申请阅读锁的函数原型为:public void AcquireReaderLock( int millisecondsTimeout ) ,其中的参数为线程等待调度的时间。函数定义如下:public void AcquireReaderLock( int millisecondsTimeout ) { // m_mutext 很快可以得到,以便进入临界区m_mutex.WaitOne( ); // 是否有写入线程存在 bool bExistingWriter = ( m_nActive < 0 ); if( bExistingWriter ) { // 等待阅读线程数目加1, 当有锁释放时,根据此数目来调度线程 m_nWaitingReaders++; } else { // 当前活动线程加1 m_nActive++; } m_mutex.ReleaseMutex();

相关主题