VB6.0升级到VB.NET后,发现随机数函数也发生了变化,在VB.NET中Random类是一种能够产生满足某些随机性统计需求的数字序列的伪随机数生成器。
在代码把光标定位到单词Random,点F1键获取帮助。
一、Random类常用知识点(以下内容来源于帮助,点击进入Random类帮助网页):
1、构造函数:
(1)、Random()
使用与时间相关的默认种子值,初始化 Random 类的新实例。
(2)、Random(Int32)
使用指定的种子值初始化 Random 类的新实例。
参数为种子值,数据类型为Int32,用来计算伪随机数序列起始值的数字。 如果指定的是负数,则使用其绝对值。
2、方法:
(1)、Next:返回一个随机整数。
A、无参数:Next()——返回一个非负随机整数。
B、一个参数:Next(maxValue) ——返回一个小于所指定最大值的非负随机整数。
参数(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(sender As Object, e As EventArgs) Handles MyBase.LoadDim rand As Random = New Random(66)For i As Integer = 0 To 10Me.Label1.Text = Me.Label1.Text & rand.Next() & Environment.NewLineNextEnd Sub

每次运行程序均生成相同的随机数序列,如下图所示,不信你就测试一下。

三、怎样才能每次运行程序时均生成不同的随机数?
其实很简单,就是每次运行程序时改变Random类的构造函数的种子值,可以有以下做法:
第一种方式: 使用无参数的Random()构造函数;
默认种子值是使用DateTime.Now.Ticks作为种子值的,如果触发Random函数间隔时间很短, 就有可能造成产生一样的随机数。
第二种方式: 使用RNGCryptoServiceProvider生成种子值;生成速度较慢。
在帮助里有看到推荐,如下图:

第三种方式: 使用Guid生成种子值; 生成速度快。
测试代码如下:

Public Class Form1''' <summary>''' 通过RNGCryptoServiceProvider获取种子值''' </summary>''' <returns></returns>Private Shared Function GetRandomSeed() As IntegerDim 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="sender"></param>''' <param name="e"></param>Private Sub BtnTime_Click(sender As Object, e As EventArgs) Handles BtnTime.ClickDim rand As Random = New Random()Me.Label1.Text = ""For i As Integer = 0 To 10Me.Label1.Text = Me.Label1.Text & rand.Next() & Environment.NewLineNextEnd Sub''' <summary>''' RNGCryptoServiceProvider种子生成随机数''' </summary>''' <param name="sender"></param>''' <param name="e"></param>Private Sub BtnRNG_Click(sender As Object, e As EventArgs) Handles BtnRNG.ClickDim rand As Random = New Random(GetRandomSeed())Me.Label1.Text = ""For i As Integer = 0 To 10Me.Label1.Text = Me.Label1.Text & rand.Next() & Environment.NewLineNextEnd Sub''' <summary>''' Guid种子生成随机数''' </summary>''' <param name="sender"></param>''' <param name="e"></param>Private Sub BtnGuid_Click(sender As Object, e As EventArgs) Handles BtnGuid.ClickDim rand As Random = New Random(GetRandomSeedbyGuid())Me.Label1.Text = ""For i As Integer = 0 To 10Me.Label1.Text = Me.Label1.Text & rand.Next() & Environment.NewLineNextEnd Sub
End Class

四、生成数字和字母组合的随机数
开始想到用ASCII码,但数字、小写字母及大写字母的ASCII码是不连续的,觉得不是很理想,下面的方法感觉还不错,做个笔记。

Public Function GetAlphanumeric() As StringDim 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 sequence As Integer() = New Integer(total - 1) {}Dim output As Integer() = New Integer(total - 1) {}For i As Integer = 0 To total - 1sequence(i) = iNextDim random As Random = New Random()Dim _End As Integer = total - 1For i As Integer = 0 To total - 1Dim num As Integer = random.[Next](0, _End + 1)output(i) = sequence(num)sequence(num) = sequence(_End)_End -= 1NextReturn outputEnd Function

本文参考了以下博文:
不重复随机数列生成算法
学习过程得到网友uruseibest的帮助,表示感谢!

VB.NET学习笔记:使用Random类生成随机数(不重复、数字、字母)相关推荐

  1. 【java笔记】random类生成随机数

    导包: import java.util.Random; 创建: Random r=new Random();//小括号当中留空即可 使用: 获取一个随机的int数字: int num=r.nextI ...

  2. Random()类生成随机数详解

    Random类介绍 生成随机数的两种方法 是用Math类里的Random方法生成0到1内的随机数,返回是double 是用Random类方法生成随机数 Random()函数生成随机数介绍 在Java的 ...

  3. Random类生成随机数详解

    先看看Random的构造方法 public Random() {this(seedUniquifier() ^ System.nanoTime());}public Random(long seed) ...

  4. Kotlin学习笔记12——数据类和密封类

    Kotlin学习笔记12--数据类和密封类 前言 数据类 在类体中声明的属性 复制 componentN 解构声明 密封类 尾巴 前言 上一篇,我们学习了Kotlin中的拓展,今天继续来学习Kotli ...

  5. JVM学习笔记(Ⅰ):Class类文件结构解析(带你读懂Java字节码,这一篇就够了)

    JVM学习笔记(Ⅰ):Class类文件结构解析,带你读懂Java字节码 前言:本文属于博主个人的学习笔记,博主也是小白.如果有不对的地方希望各位帮忙指出.本文主要还是我的学习总结,因为网上的一些知识分 ...

  6. VBA学习笔记(9)--生成点拨(1)

    VBA学习笔记(9)--生成点拨(1) 说明(2017.3.26): 1. 还没写完,写到新建文件夹了,下一步新建word,重命名,查找点拨,把点拨复制进去,因为要给点拨编号,应该会很麻烦 1 Pub ...

  7. 学习使用js的 random() 方法生成随机数

    学习使用js的 random方法生成随机数 生成随机数1-100 Math.floor用法 Math.random()方法 生成随机数1-100 <!DOCTYPE html> <h ...

  8. java随机数语句_Java语言程序设计(七)Math类生成随机数及if语句

    Java有几种类型的选择语句,单向if语句,双向if语句,嵌套if语句,switch语句和条件表达式. 1.单向if语句 if(radius>=0){ area = radius*radius* ...

  9. Python中random模块生成随机数详解

    Python中random模块生成随机数详解 本文给大家汇总了一下在Python中random模块中最常用的生成随机数的方法,有需要的小伙伴可以参考下 Python中的random模块用于生成随机数. ...

最新文章

  1. java中的pattern_Java Pattern的用法是什么?
  2. 微软成功抵御峰值高达 2.4Tbps 的 DDoS 攻击
  3. 变分自编码器VAE代码
  4. 爱心志愿者义工俱乐部公告
  5. 【Linux】一步一步学Linux——iptables命令(186)
  6. Django如何安装指定版本
  7. Step by Step to download a material from ERP via request download
  8. 事务流程java怎么实现_使用队列和事务实现采集数据实例流程
  9. elementUI表格组件:自定义列模板(完整案例)
  10. golang位左移赋值
  11. “好烦!自拒修电脑后,妹子又约我学机器学习,咋办?”
  12. 在别人客户端上修改,来匹配测试自己的服务端
  13. 《.Net 软件设计新思维》作者讲述成书的背后故事
  14. js 模拟表单post提交
  15. 天梯赛-愿天下有情人都是失散多年的兄妹-题解
  16. cad工具快速选择特性里面是空的解决方法
  17. IT创业网赚项目 - 做视频网赚项目,选择好平台很重要!
  18. 【读书笔记】数学之美(下)
  19. windows桌面便笺使用小技巧Win10便利贴不见了在哪里调出来Win10便签怎么用
  20. bzoj1787 [Ahoi2008]Meet 紧急集合

热门文章

  1. 发错邮件后你知道怎么撤回邮件吗?163vip邮箱邮件撤回了解一下
  2. 上班,老实人和精明人的区别是什么?
  3. PEEKABOO——团队展示
  4. 在fpga中用Cordic算法来产生正弦函数
  5. Python爬虫实战案例:取喜马拉雅音频数据详解
  6. leaflet地图和飞线
  7. FreeRTOS笔记篇:第七章 -- 资源管理(互斥锁、二进制信号量、死锁)
  8. Android / iOS 招聘
  9. 少年上人号怀素下一句,这首诗本是咏怀素的,却在结尾幽了张旭一默,我白够狂︱浅雨
  10. DNN与推荐两大门派,一念神魔,功不唐捐