02 RandomUtil 随机数据处理
作者:谎言诞行    发布时间:2024年11月07日

1、关于随机数据

        在如今这社会,随机数据应用是相当广泛的。比如:登录验证码、测试数据生成 等等。在讨论随机数据处理之前,我们先要理解一些概念:随机数伪随机数

        随机数是专门的随机试验的结果。在统计学的不同技术中需要使用随机数,比如在从统计总体中抽取有代表性的样本的时候,或者在将实验动物分配到不同的试验组的过程中,或者在进行蒙特卡罗模拟法计算的时候等等。产生随机数有多种不同的方法。这些方法被称为随机数发生器。随机数最重要的特性是:它所产生的后面的那个数与前面的那个数毫无关系

        伪随机数是用确定性的算法计算出来自 [0, 1) 均匀分布的随机数序列。并不真正的随机,但具有类似于随机数的统计特征,如均匀性、独立性等。在计算伪随机数时,若使用的初值(种子)不变,那么伪随机数的数序也不变。伪随机数可以用计算机大量生成,在模拟研究中为了提高模拟效率,一般采用伪随机数代替真正的随机数。模拟中使用的一般是循环周期极长并能通过随机数检验的伪随机数,以保证计算结果的随机性。

        现在,大家了解随机数据的基本概念了。我们当前要使用的就是计算机程序中,通过伪随机数生成工具,来生成伪随机数据,也可以称为伪随机字符。

        在前面的文章《关于 SQL Server 测试用的随机数据生成》中,我们介绍了在数据库中的随机数据生成。接下来,我们将要讲解在 Java 语言中,如何获取随机数据。在实现方式上,Java 代码的实现方式与数据库的函数略有不同,大家可以查看源代码,自行对比

2、关于 Java 中的随机数

        在 Java 中,伪随机数的获取主要通过一个类 java.util.Random 来处理。如果只是获取一个随机浮点值,它有一个简便的调用方式:java.lang.Math.random () 。 Java 官方 API 描述中,有几点需要注意,大概描述如下:

        (1)java.util.Random 类的实例用于生成伪随机数流。该类使用 48 位种子,该种子使用线性同余公式进行修改。

        (2)java.util.Random 的实例是线程安全的。但是,跨线程并发使用同一个 java.util.Random 实例可能会遇到争用,从而导致性能不佳。请考虑在多线程设计中使用 ThreadLocalRandom。

        (3)java.util.Random 的实例在加密上不安全。请考虑改用 SecureRandom 来获取加密安全的伪随机数生成器,以供安全敏感的应用程序使用。

2.1、简单的调用示例

        在介绍我自己工具包的处理前,我们先看看原生 Java 程序怎么获取随机数。目前,提供的原生 API 中,只能生成数字。比如:布尔型,整型,浮点型 之类的。

2.1.1、不带种子,直接生成数

image.png

image.png

2.1.2、设置种子,生成随机数

image.png

image.png

2.1.3、用相同的种子,创建2个实例,然后分别调用看随机数是否会相同

image.png

image.png

注意:

通过上图我们可以看出,如果2个不同的随机生成器实例,使用了同一个种子,会产生相同的随机序列。因此,随机生成器的种子必须唯一,不能重复。在工具包(pdc-common-tool)中,我使用操作系统的纳秒级时间作为随机种子。如下图:

image.png

注意:这图片上有个错误。纳秒,是毫秒的百万分之一,是小数点后9位,是 0.000000001秒。另外,还需要注意,并非所有的平台,都能返回完整的纳秒数据。有些平台受硬件、操作系统等影响,返回的数据精度,仅仅是微秒,即图片上说的,毫秒的千分之一,小数点后6位。但是,它的有效精度,仍然高于毫秒值。

3、关于工具包中的随机数API

        工具包(pdc-common-tool)中的随机数据处理工具类,是用于生成一些随机字符串的(比如:随机的字数字和字母混合字符串)。由于目的比较简单,所以功能也相对简单。在处理上,有2种不同的处理方式:抛出异常 和 不抛异常。

  • 在调用会抛出异常的函数时,需要调用者自己捕捉异常,并处理

  • 在调用不会抛出异常的函数时,需要判断返回结果。如果返回了与常量 RandomUtil. ERROR_CODE 的值相同,则表示生成遇到异常,需要检查日志内容。

        下面编写代码,用简单的示例来说明,如何调用 随机数生成 API。具体封装了哪些函数,大家可以参考 Javadoc 里面的说明

3.1、带异常抛出处理,调用示例

image.png

image.png

        从上图可以看出,第1个调用,生成了长度为4的随机字母。第2个调用,长度校验不通过,直接抛异常

3.2、不带异常抛出的处理,调用示例

image.png

image.png

        如上图,对于不抛异常的函数,在内部已经把日志打印了,不需要额外的处理。

        

        本章完结

填写一种颜色的字符(不区分大小写),1分钟有效,点击图片刷新