VB学习笔记:使⽤Random类⽣成随机数(不重复、数字、字母)
VB6.0升级到VB后,发现随机数函数也发⽣了变化,在VB中Random类是⼀种能够产⽣满⾜某些随机性统计需求的数字序列的伪随机数⽣成器。
在代码把光标定位到单词Random,点F1键获取帮助。
⼀、Random类常⽤知识点(以下内容来源于帮助,):
1、构造函数:
琐屑
(1)、Random()
使⽤与时间相关的默认种⼦值,初始化 Random 类的新实例。
(2)、Random(Int32)
使⽤指定的种⼦值初始化 Random 类的新实例。
参数为种⼦值,数据类型为Int32,⽤来计算伪随机数序列起始值的数字。 如果指定的是负数,则使⽤其绝对值。
2、⽅法:
(1)、Next:返回⼀个随机整数。rather的用法
A、⽆参数:Next()——返回⼀个⾮负随机整数。
B、⼀个参数:Next(maxValue) ——返回⼀个⼩于所指定最⼤值的⾮负随机整数。
calvin
参数(maxValue):类型为Int32,要⽣成的随机数的上限(随机数不能取该上限值)。maxValue 必须⼤于或等于 0。
返回值:类型为Int32,⼤于或等于零且⼩于 maxValue 的 32 位有符号整数,即:返回值的范围通常包括零但不包括 maxValue。 但是,如果 maxValue 等于 0,则返回 maxValue。
C、两个参数:Next(minValue,maxValue)——返回在指定范围内的任意整数。
参数(minValue):类型为Int32,返回的随机数的下界(随机数可取该下界值)。
参数(maxValue):类型为Int32,返回的随机数的上界(随机数不能取该上界值)。 maxValue 必须⼤于或等于 minValue。
返回值:类型为Int32,⼀个⼤于等于 minValue 且⼩于 maxValue 的 32 位带符号整数,即:返回的值范围包括 minValue 但不包括maxValue。 如果 minValue 等于 maxValue,则返回 minValue。
(2)、NextBytes:⽤随机数填充指定字节数组的元素。
NextBytes(buffer)
参数(buffer):Byte[],包含随机数的字节数组。
说明:字节数组的每个元素设置为随机数字⼤于或等于 0,且⼩于或等于MaxValue。
(3)、NextDouble:返回⼀个⼤于或等于 0.0 且⼩于 1.0 的随机双精度型浮点数。
没有参数,返回值类型为Double。
3、使⽤⽅法:
要⽣成各种类型的随机数,必须先得到它的实例对象,然后再⽣成随机数。注意只实例化⼀个对象,可以多次⽅法调⽤,⽣成的数字分布均匀,每个数字返回的可能性均相等。
⼆、Random类⽣成随机数的弱点
Random类⽣成随机数是伪随机数,所以在Random的内部产⽣机制中还是有⼀定规律的,并⾮是真正意义上的完全随机。 如果种⼦值相同则每次均产⽣相同的随机数。如下⾯代码在构造函数中指定了种⼦值:主语
Private Sub Form1_Load(nder As Object, e As EventArgs) Handles MyBa.Load
Dim rand As Random = New Random(66)
For i As Integer = 0 To 10
Me.Label1.Text = Me.Label1.Text & rand.Next() & Environment.NewLine
Next
End Sub
每次运⾏程序均⽣成相同的随机数序列,如下图所⽰,不信你就测试⼀下。
vesak day
三、怎样才能每次运⾏程序时均⽣成不同的随机数?
其实很简单,就是每次运⾏程序时改变Random类的构造函数的种⼦值,可以有以下做法:
第⼀种⽅式: 使⽤⽆参数的Random()构造函数;
默认种⼦值是使⽤DateTime.Now.Ticks作为种⼦值的,如果触发Random函数间隔时间很短, 就有可能造成产⽣⼀样的随机数。第⼆种⽅式: 使⽤RNGCryptoServiceProvider⽣成种⼦值;⽣成速度较慢。
在帮助⾥有看到推荐,如下图:
第三种⽅式: 使⽤Guid⽣成种⼦值; ⽣成速度快。
测试代码如下:
Public Class Form1
''' <summary>英语4级
艾薇儿歌曲mv''' 通过RNGCryptoServiceProvider获取种⼦值
''' </summary>
''' <returns></returns>
suggestion是什么意思Private Shared Function GetRandomSeed() As Integer
Dim bytes As Byte() = New Byte(3) {}
Dim rng As System.Security.Cryptography.RNGCryptoServiceProvider = New System.Security.Cryptography.RNGCryptoServiceProvider() rng.GetBytes(bytes)
Return BitConverter.ToInt32(bytes, 0)
End Function
''' <summary>
''' 通过Guid获取种⼦值
''' </summary>
''' <returns></returns>
Private Shared Function GetRandomSeedbyGuid() As Integer
'Return New Guid().GetHashCode()
Return Guid.NewGuid().GetHashCode()
End Function
''' <summary>
''' 默认种⼦值⽣成随机数
''' </summary>
''' <param name="nder"></param>
''' <param name="e"></param>
Private Sub BtnTime_Click(nder As Object, e As EventArgs) Handles BtnTime.Click
Dim rand As Random = New Random()
Me.Label1.Text = ""
For i As Integer = 0 To 10
Me.Label1.Text = Me.Label1.Text & rand.Next() & Environment.NewLine
Next
End Sub
''' <summary>
''' RNGCryptoServiceProvider种⼦⽣成随机数
''' </summary>
''' <param name="nder"></param>
''' <param name="e"></param>
Private Sub BtnRNG_Click(nder As Object, e As EventArgs) Handles BtnRNG.Click
Dim rand As Random = New Random(GetRandomSeed())
Me.Label1.Text = ""
For i As Integer = 0 To 10
Me.Label1.Text = Me.Label1.Text & rand.Next() & Environment.NewLine
Next
show offEnd Sub
''' <summary>
''' Guid种⼦⽣成随机数
''' </summary>
''' <param name="nder"></param>
''' <param name="e"></param>
Private Sub BtnGuid_Click(nder As Object, e As EventArgs) Handles BtnGuid.Click
Dim rand As Random = New Random(GetRandomSeedbyGuid())
Me.Label1.Text = ""
For i As Integer = 0 To 10
Me.Label1.Text = Me.Label1.Text & rand.Next() & Environment.NewLine
Next
End Sub
End Class
四、⽣成数字和字母组合的随机数
开始想到⽤ASCII码,但数字、⼩写字母及⼤写字母的ASCII码是不连续的,觉得不是很理想,下⾯的⽅法感觉还不错,做个笔记。
Public Function GetAlphanumeric() As String
Dim str As String = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" Dim rnd As New Random()
'返回数字
'Return rnd.[Next](10).ToString()
'返回⼩写字母
Return str.Substring(10 + rnd.[Next](26), 1)
'返回⼤写字母
'Return str.Substring(36 + rnd.[Next](26), 1)
'返回⼤⼩写字母混合
'Return str.Substring(10 + rnd.[Next](52), 1)
'返回⼩写字母和数字混合
'Return str.Substring(0 + rnd.[Next](36), 1)
'返回⼤写字母和数字混合
'Return str.Substring(0 + rnd.[Next](36), 1).ToUpper()
在家办公
'返回⼤⼩写字母和数字混合
'Return str.Substring(0 + rnd.[Next](61), 1)
End Function
五、⽣成不重复随机数
1、 从N个数中随机取出⼀个数,与数组第N个数调换;
2、 从前N-1个数中随机取出⼀个数,与第(N-1)个数调换;
……
代码通过_end-1,把⽣成过的数⽤最后⼀个数代替,省去删除移动的开销。
代码如下:
Public Function GetRandomSequence(ByVal total As Integer) As Integer()
Dim quence As Integer() = New Integer(total - 1) {}
Dim output As Integer() = New Integer(total - 1) {}
For i As Integer = 0 To total - 1
quence(i) = i
Next
Dim random As Random = New Random()
Dim _End As Integer = total - 1
For i As Integer = 0 To total - 1
Dim num As Integer = random.[Next](0, _End + 1)
output(i) = quence(num)
quence(num) = quence(_End)
_End -= 1
Next
Return output
End Function
本⽂参考了以下博⽂:
学习过程得到⽹友的帮助,表⽰感谢!