一、要产生1到100之间的随机数,首先了解Rnd函数的用法,Rnd函数产生的是0和1之间的随机数,范围是[0,1),包括0,但不包括1。因此要产生1~100之间的随机数,可以使用Rnd98,产生的是[0,98)的随机数,而int(Rnd98)产生的是[0,97]之间的随机整数,那么int(Rnd98)+2产生的就是[2,99]之间的随机整数了,符合目标1到100之间的随机数目的。函数代码如下:Public Function sj() As Integer Randomize sj = Int(Rnd 98) + 2End Function二、举个例子,要产生10个1到100之间的随机整数,如下:1、打开VB60开发软件,新建一个标准exe工程;2、在设计界面上添加一个Text控件和一个Command控件;3、Command1控件的Caption属性设置为"产生10个1~100之间的随机数"。4、双击Command1控件,进入代码编辑界面,输入如下代码:Public Function sj() As Integer Randomize sj = Int(Rnd 98) + 2End FunctionPrivate Sub Command1_Click()Text1Text = ""For i = 1 To 10 Text1Text = Text1Text & sj() & " "Next iEnd Sub5、运行工程,单击按钮,可以看到Text1控件中产生的10个1~100之间的随机整数。
1Abs 函数
返回数字的绝对值。
Abs(number)
number 参数可以是任意有效的数值表达式。如果 number 包含 Null,则返回 Null;如果是未初始化变量,则返回 0。
说明
数字的绝对值是其无符号的数值大小。例如,Abs(-1) 和 Abs(1) 都返回 1。
下面示例利用 Abs 函数计算数字的绝对值:
Dim MyNumber
MyNumber = Abs(503 ) '返回 503。
MyNumber = Abs(-503) '返回 503。
2Atn 函数返回数值的反正切值。
Atn(number)
number 参数可以是任意有效的数值表达式。
说明
Atn 函数计算直角三角形两个边的比值 (number) 并返回对应角的弧度值。此比值是该角对边的长度与邻边长度之比。结果的范围是从 -pi/2 到 pi/2 弧度。
弧度变换为角度的方法是将弧度乘以 pi/180。反之,角度变换为弧度的方法是将角度乘以180/pi 。
下面的示例利用 Atn 来计算 pi 的值:
Dim pi
pi = 4 Atn(1) ' 计算 pi 的值。
注意 Atn 是 Tan(将角作为参数返回直角三角形两边的比值)的反三角函数。不要混淆 Atn 与余切(正切的倒数 (1/tangent))函数。
3Cos 函数
返回某个角的余弦值。
Cos(number)
number 参数可以是任何将某个角表示为弧度的有效数值表达式。
说明
Cos 函数取某个角并返回直角三角形两边的比值。此比值是直角三角形中该角的邻边长度与斜边长度之比。结果范围在 -1 到 1 之间。
角度转化成弧度方法是用角度乘以 pi/180。反之,弧度转化成角度的方法是用弧度乘以 180/pi。
下面的示例利用 Cos 函数返回一个角的余弦值:
Dim MyAngle, MySecant
MyAngle = 13 ' 用弧度定义一个角。
MySecant = 1 / Cos(MyAngle) ' 计算正割。
4Exp 函数
返回 e(自然对数的底)的幂次方。
Exp(number)
number 参数可以是任意有效的数值表达式。
说明
如果 number 参数超过 709782712893,则出现错误。常数 e 的值约为 2718282。
注意 Exp 函数完成 Log 函数的反运算,并且有时引用为反对数形式。
下面的示例利用 Exp 函数返回 e 的幂次方:
Dim MyAngle, MyHSin ' 用弧度定义角。
MyAngle = 13 ' 计算双曲线的正弦。
MyHSin = (Exp(MyAngle) - Exp(-1 MyAngle)) / 2
5Int、Fix 函数
返回数字的整数部分。
Int(number)
Fix(number)
number 参数可以是任意有效的数值表达式。如果 number 参数包含 Null,则返回 Null。
说明
Int 和 Fix 函数都删除 number 参数的小数部分并返回以整数表示的结果。
Int 和 Fix 函数的区别在于如果 number 参数为负数时,Int 函数返回小于或等于 number 的第一个负整数,而 Fix 函数返回大于或等于 number 参数的第一个负整数。例如,Int 将 -84 转换为 -9,而 Fix 函数将 -84 转换为 -8。
Fix(number) 等同于:
Sgn(number) Int(Abs(number))
下面的示例说明 Int 和 Fix 函数如何返回数字的整数部分:
MyNumber = Int(998) ' 返回 99。
MyNumber = Fix(992) ' 返回 99。
MyNumber = Int(-998) ' 返回 -100。
MyNumber = Fix(-998) ' 返回-99。
MyNumber = Int(-992) ' 返回 -100。
MyNumber = Fix(-992) ' 返回 -99。
6Log 函数
返回数值的自然对数。
Log(number)
number 参数是任意大于 0 的有效数值表达式。
说明
自然对数是以 e 为底的对数。常数 e 的值约为 2718282。
用 n 的自然对数除 x 的自然对数,可以得到以 n 为底的 x 的对数。如下所示:
Logn(x) = Log(x) / Log(n)以下示例为一个自定义的 Function 过程,该过程计算以 10 为底的对数:
Function Log10(X)
Log10 = Log(X) / Log(10)
End Function
7Rnd 函数
返回一个随机数。
Rnd[(number)]
number 参数可以是任意有效的数值表达式。
说明
Rnd 函数返回一个小于 1 但大于或等于 0 的值。number 的值决定了 Rnd 生成随机数的方式:
如果 number 为 Rnd 生成
小于零 每次都相同的值,使用 number 作为种子。
大于零 序列中的下一个随机数。
等于零 最近生成的数。
省略 序列中的下一个随机数。
因每一次连续调用 Rnd 函数时都用序列中的前一个数作为下一个数的种子,所以对于任何最初给定的种子都会生成相同的数列。
在调用 Rnd 之前,先使用无参数的 Randomize 语句初始化随机数生成器,该生成器具有基于系统计时器的种子。
要产生指定范围的随机整数,请使用以下公式:
Int((upperbound - lowerbound + 1) Rnd + lowerbound)
这里, upperbound 是此范围的上界,而 lowerbound 是此范围内的下界。
注意 要重复随机数的序列,请在使用数值参数调用 Randomize 之前,立即用负值参数调用 Rnd。使用同样 number 值的 Randomize 不能重复先前的随机数序列。
8Sgn 函数
返回表示数字符号的整数。
Sgn(number)
number 参数可以是任意有效的数值表达式。
返回值
Sgn 函数有如下返回值:
如果 number 为 Sgn 返回
大于零 1
等于零 0
小于零 -1
说明
number 参数的符号决定 Sgn 函数的返回值。
下面的示例利用 Sgn 函数决定数值的符号:
Dim MyVar1, MyVar2, MyVar3, MySign
MyVar1 = 12: MyVar2 = -24: MyVar3 = 0
MySign = Sgn(MyVar1) ' 返回 1。
MySign = Sgn(MyVar2) ' 返回 -1。
MySign = Sgn(MyVar3) ' 返回 0。
9Sin 函数返回某个角的正弦值。
Sin(number)
number 参数可以是任何将某个角表示为弧度的有效数值表达式。
说明
Sin 函数取某个角并返回直角三角形两边的比值。此比值是直角三角形中该角的对边长度与斜边长度之比。结果的范围在 -1 到 1 之间。
将角度乘以 pi/180 即可转换为弧度,将弧度乘以 180/pi 即可转换为角度。
下面例子利用 Sin 返回角度的正弦:
Dim MyAngle, MyCosecant
MyAngle = 13 ' 用弧度定义角度。
MyCosecant = 1 / Sin(MyAngle) '计算余割。
10Sqr 函数
Sqr(number)
number 参数可以是任意有效的大于或等于零的数值表达式。
说明
下面的示例利用 Sqr 函数计算数值的平方根:
Dim MySqr
MySqr = Sqr(4) ' 返回 2。
MySqr = Sqr(23) ' 返回479583152331272。
MySqr = Sqr(0) ' 返回0。
MySqr = Sqr(-4) ' 产生实时错误。
11Tan 函数
返回某个角的正切值。
Tan(number)
number 参数可以是任何将某个角表示为弧度的有效数值表达式。
说明
Tan 取某个角并返回直角三角形两个直角边的比值。此比值是直角三角形中该角的对边长度与邻边长度之比。
将角度乘以 pi/180 即可转换为弧度,将弧度乘以 180/pi 即可转换为角度。
下面的示例利用 Tan 函数返回角度的正切:
Dim MyAngle, MyCotangent
MyAngle = 13 ' 用弧度定义角度。
MyCotangent = 1 / Tan(MyAngle) ' 计算余切
附:
派生数学函数
下列是由固有数学函数派生的非固有数学函数:
函数 派生的等效公式
Secant(正割) Sec(X) = 1 / Cos(X)
Cosecant(余割) Cosec(X) = 1 / Sin(X)
Cotangent(余切) Cotan(X) = 1 / Tan(X)
Inverse Sine(反正弦) Arcsin(X) = Atn(X / Sqr(-X X + 1))
Inverse Cosine(反余弦) Arccos(X) = Atn(-X / Sqr(-X X + 1)) + 2 Atn(1)
Inverse Secant(反正割) Arcsec(X) = Atn(X / Sqr(X X - 1)) + Sgn((X) -1) (2 Atn(1))
Inverse Cosecant(反余割) Arccosec(X) = Atn(X / Sqr(X X - 1)) + (Sgn(X) - 1) (2 Atn(1))
Inverse Cotangent(反余切) Arccotan(X) = Atn(X) + 2 Atn(1)
Hyperbolic Sine(双曲正弦) HSin(X) = (Exp(X) - Exp(-X)) / 2
Hyperbolic Cosine(双曲余弦) HCos(X) = (Exp(X) + Exp(-X)) / 2
Hyperbolic Tangent(双曲正切) HTan(X) = (Exp(X) - Exp(-X)) / (Exp(X) + Exp(-X))
Hyperbolic Secant(双曲正割) HSec(X) = 2 / (Exp(X) + Exp(-X))
Hyperbolic Cosecant(双曲余割) HCosec(X) = 2 / (Exp(X) - Exp(-X))
Hyperbolic Cotangent(双曲余切) HCotan(X) = (Exp(X) + Exp(-X)) / (Exp(X) - Exp(-X))
Inverse Hyperbolic Sine(反双曲正弦) HArcsin(X) = Log(X + Sqr(X X + 1))
Inverse Hyperbolic Cosine(反双曲余弦) HArccos(X) = Log(X + Sqr(X X - 1))
Inverse Hyperbolic Tangent(反双曲正切) HArctan(X) = Log((1 + X) / (1 - X)) / 2
Inverse Hyperbolic Secant(反双曲正割) HArcsec(X) = Log((Sqr(-X X + 1) + 1) / X)
Inverse Hyperbolic Cosecant(反双曲余割) HArccosec(X) = Log((Sgn(X) Sqr(X X + 1) +1) / X)
Inverse Hyperbolic Cotangent(反双曲余切) HArccotan(X) = Log((X + 1) / (X - 1)) / 2
以 N 为底的对数 LogN(X) = Log(X) / Log(N)
函数名
参数
返回结果
Ascii
(char_expr)
返回表达式中第一个字符的ASCII编码
Char
(integer_expr)
将单字节的integer值转换为character值。Char通常作为ascii的反函数使用。Integer_expr必须是0到255之间的数。
返回的是char数据类型。如果结果值是多字节字符的第一字节,则字符将是未定的。
Charindex
(expression1,expression2)
查找expression1在expression2中的起始位置并返回表示起始位置的integer整数值。如果没有找到expression1则返回0。如果expression1包含通配符,将其按文字处理。
Char_length
(char_expr)
返回字符串表达式或text值的长度。对于表中列的可变长数据,在计算字符表达式长度时去掉尾空格。对于多字节字符集,字符长度小于字节数,使用系统函数来确定字节数。
Difference
(char_expr1,char_expr2)
返回表示两个soundex值不同的整数值。
Lower
(char_expr)
将大写字母转换成小写字母,返回character类型值
Itrim
(char_expr)
删除字符串表达式中的前导空格。只有与SQL中指定的字符集中的空格值等价的字符才被删除。
Patindex
(“%pattern%”,
char_expr[using{bytes|
chars|characters}])
返回在指定字符串中第一次出现pattern的起始位置的integer型数据,如果没有找到pattern则返回0。缺省情况下返回字符的偏移量(多个字节的字符串)必须指定using bytes。通配符”%”必须放在pattern的前面或后面。除非要找的位置为起始字符或结尾字符。该函数可被用于text数据
Replicate
(char_expr,integer_expr)
返回一个与char_expr的类型相同的字符串。该字符串是char_expr次的结果(当结果多于255个字节时,则只取前255个字节)。
Reverse
(expression)
逆转字符串或二进制数据的值。如果表达式是“abcd”则返回“dcba”;如果表达式是”0x12345000”,则返回”0x00054321
Right
(expression,integer_expr)
返回从右边开始指定个数的字符串或二进制expression的一部分。返回值同expression具有相同的数据类型
Rtrim
(char_expr)
删除尾空格。只有与SQL中指定的字符集中的空格值等价的字符才被删除。
Soundex
(char_expr)
返回由相邻的单字节或双字节正体字母组成的字符串的一个4字符的soundex代码
Space
(integer_expr)
返回integer_expr个单字节空格组成的字符串
Str
(approx_numeric[,length[,decimal]])
返回代表浮点数的字符串。Length指定返回的字符串数目(包括小数点、小数点左边和右边所有的数字和空格);decimal指定结果返回的小数位数;length和decimal是可选项,如果选定,则必须为非负数。缺省的length为10,省的decimal为0为了与指定的length相符,该函数四舍五入小数部分
Stuff
(char_expr1,start,length,char_expr2)
从char_expr1中删除start开始的length个字符,然后将char_expr2插入到char_expr2的start处。如果只删除字符而不插入字符,则必须将char_expr2指定为null,而不是“”,“”表示一个空格
Substring
(expression,start,length)
返回字符串或二进制钟的一部分。Start指定子串的开始位置。Length指定子串的长度。
Upper
(char_expr)
将小写字符串转换为大写字符串 二进制串 列名或它们之间的组合。把字符串放到单引号或双引号中
+
expression
拼接两个或更多的字符串、二进制串、列名或它们之间的组合。把字符串放到单引号或双引号中。
rnd函数用于产生一个随机数序列,从这个序列选出个数作为返回值
函数中的参数是从这个随机数序列中取值的方式
小于 0 每次都使用参数作为随机数种子得到的相同结果。
大于 0 序列中的下一个随机数。
等于 0 最近生成的数。
省略 序列中的下一个随机数。
RND 函数是需要一个 种子 的。如果不给这个参数的话,默认为 0。那么,每次执行的时候得到的随机数列的值都是相同的。
为了得到不同的随机序列值,你可以使用 当前时间 作为 RND 的 种子 参数。这样一天内就不会出现相同的随机数列。
在使用过程中发现每次重新打开工作簿时,执行一次Rnd函数的宏,都会得到一个相同的随机数,后来看了一下“帮助”,在Rnd函数前加入Randomize就可以解决这一问题,但本人还是有点不放心,是不是这样做就会产生一个真正的随机数呢
最好能“剖析”一下Rnd,Randomize工作原理,越详细越好,即详细又准确的会加20分
多谢了,高手们!问题补充:
有如下命令:
Randomize
for a=1 to 6
cells(1,a)=rnd
next a
这是一个产生6个随机数的例子,如果前面没有Randomize时每次打开工作簿会产生同一个6个数的数列,那么加了Randomize(在For语句前)后,那这6个数之间的排列关系(注意:不是指这6个数的数值本身,数值本身应该是变的)是不是还是没变呢?
如果还是没变,那把Randomize加在For语句后cells前,那是不是就会改变呢?
如果还是没变,那有什么办法可以使这6个数完全随机化么?
满意答案
gupiao0000019
LV12
2013-08-29
Randomize Timer 用这个 它会以当前时间作为随机数种子,之后再产生的随机数就确实是真真正正的随机的了。
Rnd 每次执行都会合上一次Rnd的结果有关,也就是说是用上一个Rnd的结果演算过来的,所以
如果不进行初始化,那么一串 rnd 执行多少次 都一样。
只要使用了 Randomize timer之后 就相当于从一个时间点初始化了Rnd一下,那一串rnd 就不会再每次都一样了 ,因为 timer 函数 每次的时间都不一样
a = Int((99999999 - 10000000 + 1) Rnd + 10000000)
a = 10000000-99999999的随机数
Text1Text = a
Text1Text的内容变为a
For i = 1 to 8
i赋值为1,直到8为止
x = Mid(a,i,1)
x变为去掉a+i开头一位数
Next i
继续从i处开始,且i+1
注: For与Next必须要有
Randomize(x)即随机函数,Rnd(x)是一个系统内部定义的随机函数,它能产生一个0~1(不包括0和1的)之间的单精度随机数,但是,一般的随机数都是指定范围的,这个时候我们用系统指定的随机数乘以指定范围的最大数,即可得到指定范围的随机数,其书写格式为:
Rnd() x
例如,要产生一个1~12之间的随机数,可以用以下代码实现:
Private Sub Form_Click()
Randomize
Print Rnd() 12
End Sub
扩展资料
1、程序中如果只用Rnd取随机数时,每次执行都会产生相同的随机数序列。
2、要用RND函数产生不同随机数,必须配合随机种子Randomize一起使用。
3、随种子Randomize必须放在RND函数之前,控制RND函数随机数的产生。
4、实际上,VB的随机数函数发生器是用一个特殊公式计算的“随机数”,因此产生的是“伪随机数”。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)