关于概率的一点东西ch0

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qiongyu0422/article/details/83247107

概率公理

这里我们直接照抄中文维基百科的中文词条 概率公理

假设我们有一个基础集 Ω\Omega ,其子集的集合F\mathcal {F}σ\sigma代数,和一个给F\mathcal {F}的元素指定一个实数的函数 PPF\mathfrak {F} 的元素是 Ω\Omega 的子集,称为“事件”。

第一公理(非负性)

对于任意一个集合 AFA \in \mathcal {F}, 我们有 P(A)0P(A) \geq 0
即,任一事件的概率都可以用 0 到 1区间(包含0与1)上的一个实数来表示。

第二公理(归一化)

P(Ω)=1P(\Omega )=1
即,整体样本集合中的某个基本事件发生的概率为1。更加明确地说,在集合Ω\Omega 之外已经不存在基本事件了。

这在一些错误的概率计算中经常被小看;如果你不能准确地定义整个样本集合,那么任意子集的概率也不可能被定义。

第三公理(可加性)

任意两两不相交事件E1,E2,...E_{1},E_{2},...可数序列满足P(E1E2 )=P(Ei)P(E_{1}\cup E_{2}\cup \cdots )=\sum P(E_{i})
即,不相交子集的并的事件集合的概率为那些子集的概率的和。这也被称为是σ\sigma可加性。如果存在子集间的重叠,这一关系不成立。

相关概念

幂集

数学上,给定集合SS,其幂集 P(S){\mathcal{P}}(S)(或作 2S2^S )是以 SS 的全部子集为元素的集合。以符号表示即为:
P(S):={UUS} {P}(S):=\{U|U\subseteq S\}
举个例子,若 SS是集合 {a,b,c}\{a,b,c\},则SS的全部子集如下:

  • \varnothing (空集)
  • {a}\{a\}
  • {b}\{b\}
  • {c}\{c\}
  • {a,b}\{a,b\}
  • {a,c}\{a,c\}
  • {b,c}\{b,c\}
  • {a,b,c}\{a,b,c\}
    因此SS的幂集为
    P(S)={,{a},{b},{c},{a,b},{a,c},{b,c},{a,b,c}} {P}(S)= \{ \varnothing, \{a\}, \{b\}, \{c\}, \{a,b\}, \{a,c\}, \{b,c\}, \{a,b,c\} \}
    需要强调的是,幂集是一个集合的集合,其元素也都是集合。

σ\sigma代数

在数学中,某个集合XX上的σ\sigma代数又叫σ\sigma域,是XX的所有子集的集合(也就是幂集)的一个子集。这个子集满足对于差集运算和可数个并集运算的封闭性(因此对于可数个交集运算也是封闭的)。

XX为非空集合, F\mathcal{F}中的元素是XX 的子集合,满足以下条件的集合系 F\mathcal {F}称为XX上的一个σ\sigma代数:

  • XXF\mathcal{F}中;
  • 如果一个集合AAF\mathcal{F} 中,那么它的差集 AcA^{c}也在 F\mathcal{F}中;
  • 如果有可数个集合 A1,A2, ,AnA_{1},A_{2},\cdots ,A_{n}\cdots 都在 F\mathcal {F}中,那么它们的并集也在F\mathcal{F}中。

用数学语言来表示,就是

  • XFX\in \mathcal{F};
  • AFAcFA \in \mathcal{F} \Longrightarrow A^{c} \in \mathcal{F}
  • (nN   AnF)n=1AnF(\forall n\in {\mathbb {N}}~~~A_{n}\in {\mathcal {F}})\Longrightarrow \bigcup \limits _{{n=1}}^{\infty }A_{n}\in {\mathcal {F}}.
    不借助逻辑符号的话,也可以使用如下定义:设 XX为非空集合。则 XX上的一个σ\sigma代数是指其幂集的一个子集合F\mathcal{F}F\mathcal{F}中的元素,在经过有限个差集、交集或可数个并集这三种运算后依然属于 F\mathcal{F},也就是说F\mathcal{F} 对这三运算是封闭(closed)的 。

举两个σ-代数的简单例子,它们分别是:

  • XX上含集合最少的σ\sigma代数 {,X}\{\emptyset ,X\}XX上含集合最多的σ代数是 XX 的幂集2X:={A:AX}2^{X} :=\{A:A\subset X\}
  • 假设集合 X={a,b,c,d}X=\{a,b,c,d\},那么F={,{a},{b,c,d},X}\mathcal{F}=\{ \varnothing , \{a\}, \{b, c, d\}, X \} 是集合XX上的一个σ\sigma代数。这也是所有包含{a}\{a\}σ\sigma代数中最“小”的一个。

关于σ\sigma代数还有很多性质以及更深一步的讨论,为了理解概率论,不喧宾夺主。我们点到为止。但是这里还有一个概念尤为重要可数有限。但是不做过多探讨。
我先引用教材(Real Analysis (4th Edition) [Halsey Royden, Patrick Fitzpatrick])上的话来回答问题,不再具体解释了。
A set E is said to be finite provided either it is empty or there is a natural number n for which E is equipotent to {1, …, n}. We say that E is countably infinite provided E is equipotent to the set N of natural numbers. A set that is either finite or countably infinite is said to be countable. A set that is not countable is called uncountable.

概率空间

概率空间(Ω,F,P)(\Omega, \mathcal{F}, P) 是一个总测度为1的测度空间(即P(Ω)=1).

  • 第一项Ω\Omega是一个非空集合,有时称作“样本空间”。Ω\Omega的集合元素称作“样本输出”,可写作ω\omega
    A sample space, Ω\Omega , which is the set of all possible outcomes.
  • 第二项F\mathcal{F}是样本空间Ω\Omega的幂集的一个非空子集。Ω\Omega的集合元素称为事件Σ\Sigma。事件Σ\Sigma是样本空间Ω\Omega的子集。集合F\mathcal{F}必须是一个σ-代数。
    A set of eventsF\mathcal{F}, where each event is a set containing zero or more outcomes.
  • 第三项PP称为概率,或者概率测度。这是一个从集合F到实数域R的函数, P:FRP: F{\mapsto }R 。每个事件都被此函数赋予一个0和1之间的概率值。概率测度经常以黑体表示,例如 P\mathbb {P}Q\mathbb {Q},也可用符号"Pr"来表示。
    The assignment of probabilities to the events; that is, a function PP from events to probabilities.

进一步的一些概念和定义

随机变量

随机变量是一个从Ω\Omega映射到另一个集合(通常是实数域R,有时也可以到复数域)的函数。 它必须是一个可测函数。初等概率论中通常不涉及到可测性的概念,而直接把任何 X:ΩRX:\Omega \to \mathbb {R}的函数称为随机变量。比如说,若XX是一个实随机变量,则使XX为正的样本输出的集合{ωΩ:X(ω)>0}\{\omega \in \Omega:X(\omega)>0\}是一个事件。

为简便起见,{ωΩ:X(ω)>0}\{\omega \in \Omega:X(\omega)>0\}经常只写作{X>0}\{X>0\}P({X>0})P(\{X>0\})更被简化为P(X>0)P(X>0)

独立

P(AB)=P(A)P(B)P(A\cap B)=P(A)P(B),则A和B两个事件是独立的。

若任何与随机变量XX有关的事件和任何与随机变量YY有关的事件独立,则XXYY两个随机变量是独立的。

独立这个概念是概率论和测度论分道扬镳的地方。

互斥

P(AB)=0P(A\cap B)=0,则称AABB两个事件互斥或不相交(这个性质要比AB=A\cap B=\varnothing弱一些,后者是集合不相交的定义)。

若两个事件A和B不相交,则P(AB)=P(A)+P(B)P(A\cup B)=P(A)+P(B)。这个性质可以扩展到由(有限个或者可数无限个)事件组成的事件序列。 但不可数无限个事件组成的事件集合对应的概率与集合元素对应概率之和未必相等,例如若ZZ是正态分布的随机变量,则对任意xxP(Z=x)=0P(Z=x)=0,但是P(Z)=1P(Z是实数)=1

事件ABA\cap B的意思是AA并且BB;事件ABA\cup B的意思是AA或者BB.

关于互斥(mutually exclusive)和不相交(disjoint),这里 (stackexchange)有个说明还不错。
ASK:
When I study Statistical Theory, I find that these two concepts confuse me a lot.

By definition, if we say two events are PAIRWISE DISJOINT, that means the intersection of these two event is empty set. If we say that two events are MUTUALLY EXCLUSIVE, that means if one of these two events happens, the other will not. But doesn’t it means that these two events are PAIRWISE DISJOINT?

If we say two events are MUTUALLY EXCLUSIVE, then they are not INDEPENDENT. Can we say that two PAIRWISE DISJOINT events are not INDEPENDENT as well?

If these two concepts are different (actually my teacher told me they are), could you please give me an example that two events are MUTUALLY EXCLUSIVE but not PAIRWISE DISJOINT, or they are PAIRWISE DISJOINT but not MUTUALLY EXCLUSIVE.

Thank you for your help.

ANSWER:
“Disjoint” is a property of sets. Two sets are disjoint if there is no element in both of them, that is if AB=A \cap B=\varnothing.

In some (but not all!) texts, “mutually exclusive” is a slightly different property of events (sets in a probability space). Two events are mutually exclusive if the probability of them both occurring is zero, that is if Pr(AB)=0Pr(A \cap B)=0. With that definition, disjoint sets are necessarily mutually exclusive, but mutually exclusive events aren’t necessarily disjoint.

Consider points in the square with each coordinate uniformly distributed from 0 to 1. Let AA be the event where the x-coordinate is 0, and BB be the event that the y-coordinate is 0. AB={(0,0)}A\cap B=\{(0,0)\} so AA and BB are not disjoint, but Pr(AB)=0Pr(A\cap B)=0 so they are mutually exclusive.

As a second (silly, but finite) example, let the sample space be S={x,y,z}S=\{x,y,z\} with probabilities Pr({x})=0,Pr({y})=1/2Pr(\{x\})=0, Pr(\{y\})=1/2, and Pr({z})=1/2Pr(\{z\})=1/2. If A={x,y}A=\{x,y\} and B={x,z}B=\{x,z\}, then AB={x}A\cap B=\{x\}, but Pr(AB)=Pr({x})=0Pr(A \cap B)=Pr(\{x\})=0. They are mutually exclusive but not disjoint.

展开阅读全文

MSDN中的一点关于VB.NET的东西.(1)

08-01

这是MSDN中的内容,英文不太好,希望多多指正啊.^_^rnrn〔摘自MSDN〕rnVisualBasic.net语言新特性rnVisualBasic.net有在语言方面有许多崭新的、先进的特性,例如继承,界面和重载等,使其成为一种强大的面向对象程序设计语言。并且,VisualBasic程序开发者们可以运用明确的多线程功能来创建可扩充、可升级的多线程应用程序。VisualBasic.net具有其它新的语言特性诸如结构化异常处理,可定制属性,以及通用语言规范CLS。rnVisualBasic.net的大多数特性更多的是借助于CLS,即一系列用于标准化的规范。如数据类型的标准化,以及对象的包装与互操作的标准化。任何一种与CLS相兼容的程序设计语言都可以任意调用在VisualBasic.net中创建的类、对象以及组件。作为VisualBasic.net的用户,你可以从与CLS相兼容的程序设计语言中调用类、对象、组件并且你无须在意不同语言间诸如数据类型之类的差别。在CLS的诸多特性中,VisualBasic.net程序涉及到了汇编、名字空间,以及属性等特性。rn VisualBasic.net支持许多新的、先进的面向对象语言的特性,诸如继承、重载,Overrides关键字、界面、共享成员,以及构造器。rn 并且VisualBasic.net包含了许多新的数据类型,结构化的异常处理和代表。rnVisualBasic.net的语言变化rn在从VisualBasic到VisualBasic.net演化的过程中,一部分先前的语言特点保留了下来,而有些则进行了扩充,并且增加了许多新的特性。这样就不可避免的会产生一些矛盾,可能还会带来冗余。但对公共语言运行时(common language runtime)所做的改变使得它完全可以对VisualBasic语言中的一些已过时的部分进行了清理。rnVisualBasic.net中所作的改变:rn1. 简化语言规范并使代码更具有一致性。rn2. 增加了一些开发人员所要求的新特性。rn3. 使代码更易于阅读与维护。rn4. 避免程序员出现代码书写的错误。rn5. 增强了应用程序的健壮性并易于调试跟踪。rn(1) 数组边界的变化rnVisualBasic6.0rn 在VisualBasic6.0中,数组中每一维的缺省下界是0,你可以用Option Base声明来改变。你甚至可以在单个的数组声明中不考虑缺省的下界。rn 如果是缺省下界,即0,则数组中元素的个数为上界加1。如下面声明的数组Weight包含了21个元素。rn Dim Withgt(20) As SinglernVisualBasic.netrn 在VisualBasic.net中,数组中每一维的下界都是0,并且你不能将它定义为其它值。VisualBasic.net不支持Option Base声明。在数组声明中对维指定的个数即为数组初始的元素个数。如上述声明中,Weight数组中有20个元素,即从0到19。rn(2) 数组大小声明的变化rnVisualBasic6.0rn 在VisualBasic6.0中,你可以在声明时指定数组的大小,正如下例所示:rn Dim Month(0 To 11) As Integerrn 这样使得Month成为一个定长数组,并且不能用ReDim语句对其大小进行改变。rn VisualBasic.netrn 在VisualBasic.net中,一个数组不能是定长的。上面的声明可以写成如下之一:rnDim Month(12) As Integer rn Dim Month() As Integer = New Integer(12) rn这两种声明是等价的。每一种都指定了一个初始大小的数组,且在程序执行是可以用ReDim语句进行改变。如果想初始化数组中的元素,则可以用如下定义实现:rn Dim Month() As Integer = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12rn 维的数目rn 尽管数组的大小在VisualBasic.net中可以改变,但数组的维的个数却必须是固定的。下面的例子展示了如何声明一个三维数组:rn Dim Point( , , ) As Doublern ReDim语句可以改变Point数组中任意一维的大小,但Point数组的维数始终都是3。rn(3) ReDim语句的变化rn出于简化代码和改善代码可读性的目的,在VisualBasic.net中对ReDim语句的声明进rn行了修正。rn VisualBasic6.0rn 在VisualBasic6.0中,你可以用ReDim语句作为一个动态数组的初始化声明,且该数组不需要在任何地方声明。rn VisualBasic.netrn 在VisualBasic.net中,你不能用ReDim语句作为数组的声明。在一个数组出现在ReDim语句中之前,你必须象声明其它变量一样用Dim或其它等价的语句声明这个数组。rn(4) 字符串长度声明的变化rn为了保证同公共语言运行时(common language runtime)相适应,在VisualBasic.netrn中修正了对字符串长度的声明。rnVisualBasic6.0rn在VisualBasic6.0中,你可以在声明一个字符串时指定其长度。这样使得该字符串的rn长度是固定的。rn VisualBasic.netrn 在VisualBasic.net中,你不能声明一个具有固定长度的字符串。下面给出一个错误的字符串声明:rn Dim Name As String * 30rn 你必须声明没有指定长度的字符串。而当你给该字符串赋值时,值的长度决定了字符串的长度。如下例所示:rn Dim Name As String rn ' ... rn Name = "Name is now 30 characters long" ' 该字符串长度可能会在以后的代码中改变。rn 论坛

MSDN中的一点关于VB.NET的东西(3)

08-01

(12)声明语法的变化rn VisualBasic.net在代码中元素的声明方面有很多变化。rn 多变量声明rn VisualBasic.net简化了同时声明多个变量。rn VisualBasic6.0rn 在VisualBasic6.0中,你可以在同一条语句中声明多个不同类型的变量,但必须指定每一个变量的数据类型,否则缺省为Variant类型。下面的例子展示了多变量的声明及其数据类型。rnDim I, J As Integer ' I是Variant, J是Integer. rn Dim L As Integer, M As Integer ' L是Integer, M是Integer. rn Dim N As Integer, X As Double ' N是Integer, X是Double.rn VisualBasic.netrn 在VisualBasic.net中,你可以声明多个变量为同样的数据类型而不需要重复键入类型关键字。下面的声明同上述例子是等价的:rnDim I ' I是Object. rn Dim J As Integer ' J是Integer. rn ' -- 或者 -- rn Dim I As Object, J As Integer ' I是Object, J是Integer. rn Dim L, M As Integer ' L是Integer, M是Integer. rn Dim N As Integer, X As Double ' N是Integer, X是Double.rn外部过程声明rnVisualBasic6.0rn在VisualBasic6.0中,如果用Declare语句声明对外部过程的引用,则必须指定所有的参数类型和返回类型都要有As Any关键字。As Any关键字可以使传入和返回可以是任何数据类型而无需类型检查。rnVisualBasic.netrnVisualBasic.net不支持Any关键字。在Declare语句中,必须明确指定每一个参数和返回值的数据类型。这样保证了类型安全。你可以重载过程的声明以适应多样的返回类型。rn行号声明rnVisualBasic.net需要每一个行号必须紧接在冒号(:)之后。一条语句可以随意的接在冒号之后。rn(13)变量有效范围的变化rn为了支持变量的块内有效范围和改善结构化程序设计,VisualBasic.net修正了局部变量的有效范围。rnVisualBasic6.0rn在VisualBasic6.0中,在过程中声明的任何变量都有过程有效范围,这样可以在过程中在任何地方进行调用。如果变量定义在一个块中,也就是定义在End,Loop,或Next语句中,这样的变量在块外仍然可以进行调用。下面就是一个过程中变量有效范围的例子:rnFor I = 1 To 10 rn Dim N As Long ' 变量N的有效范围是整个过程,尽管将其定义在一个块中。rn N = N + Incr(I) rn Next rn W = Base ^ N '在块外,变量N仍然有效。rnVisualBasic.netrn在VisualBasic.net中,一个定义在块中的变量只具有块内有效范围,而在块外不能被访问到。上述例子重写如下:rnDim N As Long ' 变量N定义在块外,所以有效范围为整个过程。rn For I = 1 To 10 rn N = N + Incr(I) rn Next rn W = Base ^ N '在块外,变量N仍然有效,但I无效。rn然而,一个变量的生命周期仍然是整个过程,而与块内有效或过程内有效无关。如果在块内定义了一个变量,并且在整个过程的生命周期里,该块被调用了若干次,则你必须初始化该变量以避免变量产生不可预料的值。rn(14)创建对象的变化rn为了改善代码的可读性和支持带参数的构造器,VisualBasic.net修正了创建对象的过程。rnVisualBasic6.0rn在VisualBasic6.0中,用As New关键字来声明一个对象变量并且被初始化为Nothing,意味着这时并没有对象被创建。在执行过程中每次遇到该变量,在代码执行之前变量的值就被计算出来了。如果变量的值为Nothing,则该对象变量所对应的类将在变量被执行之前创建该变量。rnVisualBasic.netrn在VisualBasic.net中,不能自动的创建对象。在代码执行过程中,如果一个对象变量的值为Nothing,则不能自动创建该实例。rn你可以用相同的声明对象变量的语句来创建一个对象。下面两条语句视为等价的。rnDim Emp As New EmpObj ' 下面语句的简写。rnDim Emp As EmpObj = New EmpObj ' EmpObj被创建;Emp指向EmpObj对象。rn在Dim语句执行的同时,EmpObj对象被创建,并且Emp初始化为新建对象的引用。rn 有些类具有带参数的构造器。如果从这样的类创建的对象,可以在声明时包含构造器的参数。下面两个例子是等价的,都是向对象的构造器传递参数。rnDim Q As New Quark(12, 0.0035) ' 下面一行语句的简写。rn Dim Q As Quark = New Quark(12, 0.0035) ' 带参数的构造器。rn (15)过程声明的变化rn VisualBasic.net在过程声明方面引入了许多新的变化。rn 可选参数rn VisualBasic6.0rn 在VisualBasic6.0中,可以定义一个可选的过程参数而无须指定其默认值。如果一个可选的参数是Variant,则在过程代码中可以用IsMissing函数来确定是否缺少参数。rn VisualBasic.netrn 在VisualBasic.net中,任何可选参数必须指定一个默认值,这样如果在调用此过程时不带参数,则参数的默认值将被应用。而不需要用IsMissing函数来检查是否缺少参数,并且VisualBasic.net不支持IsMissing函数。下面例子展示了可选参数的声明:rn Sub Calculate(Optional ByVal Switch As Boolean = False)rn 静态局部变量rn VisualBasic6.0rn 在VisualBasic6.0中,可以用Static前缀来声明一个过程。这样将使所有在过程中定义的变量都是静态的,在每次调用时保留其值。rn VisualBasic.netrn 在VisualBasic.net中,不支持在Function或Sub语句前用Static前缀。如果希望局部变量为静态的,必须逐个声明为Static。rn (16)过程调用次序的变化rn VisualBasic.net引入的许多改动影响到过程的调用次序,改善了语法的一致性。rn 过程调用中的圆括号rn VisualBasic6.0rn 在VisualBasic6.0中,调用函数时参数表必须有圆括号。而在调用Sub时,如果没有Call语句,则参数表不需要有圆括号;若用Call语句调用Sub,则参数表必须有圆括号。下面的例子是合法的调用语句:rnY = Sqrt(X) rn Call DisplayCell(2, 14, Value) rn DisplayCell 2, 14, Value ' 同前一语句含义相同。rnVisualBasic.netrn在VisualBasic.net中,在所有的过程调用中,只要参数表不为空,则必须要有圆括号。在调用Sub时,Call语句是可选的。下面例子是上例的重写:rn Y = Sqrt(X) rnDisplayCell(2, 14, Value)rn返回语句rnVisualBasic6.0rn在VisualBasic6.0中,只能用Return语句返回到在GoSub语句之后的语句。两个语句都必须在同一过程中。rnVisualBasic.netrn在VisualBasic.net中,不支持GoSub语句。可以在函数或过程中用Return语句返回到其调用程序。rn(17)参数传递机制的变化rnVisualBasic.net的若干变化影响到过程的参数传递机制。rn缺省参数传递机制rnVisualBasic6.0rn在VisualBasic6.0中,如果不指定过程的参数是ByVal或ByRef,则缺省为ByRef。这样做将允许在过程中改变调用程序中的变量值。rn在过程调用中改变调用程序的变量有很大缺陷。在下面的例子中,参数传递缺省为ByRef,则变量ElapsedSeconds的值在MinutesPastHour函数中被改变,最后MsgBox函数显示的ElapsedSeconds的值是错误的。rnFunction MinutesPastHour(Seconds As Integer) As Integer rn Dim Hours As Integer = Seconds \ 3600 rn Seconds = Seconds Mod 3600 rn MinutesPastHour = Seconds \ 60 rn End Function rn ' ... rn ElapsedSeconds = CInt(Timer( )) rn ExtraMinutes = MinutesPastHour(ElapsedSeconds) rn MsgBox "Total seconds: " & ElapsedSeconds & _ rn "; minutes past hour: " & ExtraMinutesrn 向过程传递ByRef参数可以在过程中改变调用程序的变量,这可能会导致不可预料的错误。如果该过程又向其它过程传递了同样是ByRef的参数,则该参数被改变的几率就更大了。rn VisualBasic.netrn 在VisualBasic.net中,当声明了一个过程时,传递参数缺省为ByVal。这样避免了参数在过程中被改变。上述例子中的声明可以重写如下:rn Function MinutesPastHour(ByVal Seconds As Integer) As Integerrn 尽管ByVal是缺省的,但在声明过程时对每一个参数都指定为ByVal将会使代码更易于理解。rn ByRef属性的参数rn VisualBasic6.0rn 在VisualBasic6.0中,如果向过程传递的参数是属性并且带有ByRef关键字,则该属性被复制到过程调用中而不会被复制到调用该过程的程序中。这就是说,在过程中所有对该属性的改变不会影响到调用该过程的程序,即使属性是ByRef。rn VisualBasic.netrn 在VisualBasic.net中,一个ByRef属性参数会复制到过程调用中,而且会复制到调用该过程的程序中。下面例子展示了属性在过程中被改变:rnSub Reduce(ByRef Height As Single) rn ' ... ... ... ... ... ... ... '修改Height参数的代码。rn End Sub rn ' ... rn Dim Sq As Square = New Square ' Square具有Single类型的属性Side。 rnReduce(Sq.Side) ' 过程Reduce返回时,Side被改变。rn当属性参数在过程中被改变时,其值并不立即返回到调用该过程的程序中,而是直到过程返回时才影响到调用该过程的程序。rnParamArray参数rnVisualBasic6.0rn在VisualBasic6.0中,在过程声明中可以指定最后的参数带有ParamArray关键字用来接收Variant类型的数组作为参数。不允许声明这样的参数为ByRef或ByVal。它们缺省始终为ByRef。rnVisualBasic.netrn在VisualBasic.net中,ParamArray参数始终是以ByVal传递的。数组中所有的参数都必须是ParamArray参数的数据类型。rn(18)控制流语句的改变rnVisualBasic.net修正了很多语句来控制代码流的执行。rn1. GoSub语句是用来在一个过程中调用子过程。在VisualBasic.net中,可以用Call、Function和Sub语句来调用过程,而不支持GoSub语句。rn2. 为了与早期版本的BASIC相兼容,用On…GoSub和On…GoTo语句来确定GoSub和GoTo的执行。在VisualBasic.net中,可以用Select Case语句来进行多分支判断,而不支持On…GoSub和On…GoTo。尽管如此,VisualBasic.net仍然支持On Error GoTo语句。rn3. While…Wend循环当指定的条件为真时则进行循环。VisualBasic.net用End While语句代替了Wend关键字。Wend关键字不被支持。rn 论坛

一点有用的东西

09-27

Imports System.DrawingrnrnPublic Class Form1rnrn Public Structure StaticValuern Public Value As Integerrn Public CurrentTime As Stringrn End Structurernrn 'Public Structure CPUStaticsrn ' Public MinY As Integerrn ' Public MaxY As Integerrn Public CriticalLine As Integerrn Public StaticValues As new ArrayListrn Public RefreshRate As Integerrnrn 'End Structurernrn ' Private CPUStatic As CPUStaticsrn Public Const UNITDISTANCE = 10rn Public Const UNITPOINTS = 4rn Public CPUBitmap As Bitmaprn Public g As Drawing.Graphicsrn Public rdm As New Random()rnrn Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Loadrn CriticalLine = 90rn RefreshRate = 1000rn Timer1.Interval = RefreshRatern Timer1.Enabled = Truern DrawCurve()rn End Subrnrn Sub DrawCurve()rn Dim CPUPoints() As PointFrn If StaticValues.Count <= 0 Then Exit Subrnrn ReDim CPUPoints(StaticValues.Count - 1)rn Dim TotalLength As Integer = PictureBox1.Width / UNITPOINTSrnrn If TotalLength > CPUPoints.Length Thenrn For i As Integer = TotalLength - CPUPoints.Length To TotalLength - 1rn CPUPoints(i - (TotalLength - CPUPoints.Length)).X = UNITPOINTS * irn CPUPoints(i - (TotalLength - CPUPoints.Length)).Y = PictureBox1.Height - StaticValues(i - (TotalLength - CPUPoints.Length)).Value * PictureBox1.Height / 100rn Nextrn Elsern For i As Integer = 0 To TotalLength - 1rn CPUPoints(i - (TotalLength - CPUPoints.Length)).X = UNITPOINTS * irn CPUPoints(i - (TotalLength - CPUPoints.Length)).Y = PictureBox1.Height - StaticValues(i - (TotalLength - CPUPoints.Length)).Value * PictureBox1.Height / 100rn Nextrn End Ifrnrn g.Clear(Color.Black)rn g.DrawLine(Pens.LightGreen, 0, PictureBox1.Height Mod UNITDISTANCE, _rn PictureBox1.Width, PictureBox1.Height Mod UNITDISTANCE)rn For i As Integer = PictureBox1.Height Mod UNITDISTANCE To PictureBox1.Height Step UNITDISTANCErn g.DrawLine(Pens.DarkGreen, 0, i, PictureBox1.Width, i)rn Nextrnrn For i As Integer = UNITDISTANCE To PictureBox1.Width Step UNITDISTANCErn g.DrawLine(Pens.DarkGreen, i, 0, i, PictureBox1.Height)rn Nextrnrn 'draw critical line using RED colorrn Dim CriticalY As Integer = PictureBox1.Height - PictureBox1.Height * CriticalLine / 100rn g.DrawLine(New Pen(Color.Crimson, 2.0), 0, CriticalY, PictureBox1.Width, CriticalY)rnrn If Not CPUPoints Is Nothing Thenrn If CPUPoints.Length > 1 Thenrn g.DrawCurve(Pens.LightYellow, CPUPoints)rn End Ifrn End Ifrnrn PictureBox1.Refresh()rnrn End Subrnrn Sub AddCPUVaue(ByVal CPUValue As StaticValue)rn Dim tempValue As New StaticValuern tempValue = CPUValuern StaticValues.Add(tempValue)rn '假设每秒产生一次数据,一天最多产生86400个rn '这里只保存一天的数据rn If StaticValues.Count > 86400 Thenrn StaticValues.RemoveAt(0)rn End Ifrn End Subrnrn Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tickrn Dim CPUValue As StaticValuern CPUValue.Value = rdm.Next(50, 100)rn CPUValue.CurrentTime = "1"rn AddCPUVaue(CPUValue)rn 'Debug.Print(CPUValue.Value)rn DrawCurve()rnrn End Subrnrn Private Sub Form1_Resize(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Resizern If Not CPUBitmap Is Nothing Then CPUBitmap.Dispose()rn CPUBitmap = New Bitmap(PictureBox1.Width, PictureBox1.Height)rn g = Drawing.Graphics.FromImage(CPUBitmap)rn PictureBox1.Image = CPUBitmaprn PictureBox1.Refresh()rnrn End SubrnEnd Classrn 论坛

没有更多推荐了,返回首页