目录
注意导包 java.util.Random
官方解释:
准备工作:
先创建一个Random对象;
Random r = new Random();
你可以不创建,或者每个单元格里面都创建,或者直接使用,比如int n = r.nextInt(100) 可以写成 int n = new Random().nextInt(100);
单元测试
1.nextInt()
解释:上面是获取随机数,范围是int的范围,还没有测试包不包含边界,不过负数是肯定有的。
上面官方翻译的比较垃圾,简单理解为左闭右开
/**
* nextInt() ;返回下一个伪随机数,从这个随机数发生器的序列中均匀分布 int值。
* 返回值 int
*/
@Test
public void Test_nextInt()
{
for(int i = 1 ;i <= 100;i++)
{
System.out.print( i + "=" +r.nextInt() + " ");//这里不是几个空格,而是一个table
if(i % 5 == 0)
System.out.println();
}
//以下是常用的方法
/**
* nextInt(int bound) ;返回伪随机的,均匀分布 int值介于0(含)和指定值(不包括),从该随机数生成器的序列绘制。
* 简单理解为0到bound的左闭右开 即[0,bound)
*/
for(int i = 1 ;i <= 100;i++)
{
System.out.print( i + "=" +r.nextInt(100) + " ");//这里不是几个空格,而是一个table
if(i % 5 == 0)
System.out.println();
}
}
注意之前申请的Random对象 r;
r.nextInt(100) 表示0到100 的随机整数,包含0不包含100,即0到100的左闭右开区间,数学表示为[0,100) 别忘了取整数。
2.nextDouble()
注意nextDouble()方法不能这样使用,nextDouble(100),因为压根就没这方法。
/**
* nextDouble()
* 返回下一个伪随机数,从这个随机数发生器的序列中 0.0和 1.0之间的 double值 0.0分布。
* 返回值:double
*/
@Test
public void Test_nextDouble()
{
for(int i = 0 ;i < 100;i++)
{
System.out.print( i + "=" +r.nextDouble() + " ");
if(i % 5 == 0)
System.out.println();
}
System.out.println("\n///");
for(int i = 0 ;i < 100;i++)
{
System.out.print( i + "=" +r.nextDouble()*100 + " ");
if(i % 5 == 0)
System.out.println();
}
}
下面r.nextDouble()*100可以简单的理解为放大100倍,生成0-100内的double类型数据,数据太大并未测试包不包含边界值。
还有nextLong() nextFloat() nextBoolean()方法,和上面差不多,就不测试了
3.nextByte()
为什么单独把他拉出来呢,因为此方法的形式参数是数组类型,其他的方式的形式参数就没有数组类型的,所以测试了一下,果不其然大有学问!
/**
* nextBytes(byte[] bytes)
* 生成随机字节并将它们放入用户提供的字节数组中。
* 返回值:void
*/
@Test
public void Test_nextBytes()
{
byte[] b = new byte[100];
r.nextBytes(b);
System.out.println(Arrays.toString(b));
//如果不提前指定多少个
byte[] b1 ;
//r.nextBytes(b1);//报错,必须指定个数,或者为null
byte[] b2 = null;
// r.nextBytes(b2);//到这里就不执行了!!
System.out.println("///");
System.out.println(Arrays.toString(b2));//null
System.out.println("//");
System.out.println(b2.length);//空的!
}
声明byte类型数组时必须声明其长度,或者指定为null,不过其结果为空 这里的空不是空格,占不占位置不知道,因为输出其长度后返回为也是空的
注意r.nextBytes(b2)如果不注释,程序就不会运行下去了,到底什么原因不清楚,反正b2本身是null,是不能赋值得吧。debug到这一句直接就停止了;
4. next()
/**
* next(int bits) ;生成下一个伪随机数;
* bits:二进制数
* 返回值是:protected int
*/
@Test
public void Test_next()
{
//int i = r.next(101);
System.out.println();
/*
* 由于返回值是 protected(受保护的类型),所以暂时不知道怎么用
*/
}
不会用。返回值是是受保护的int类型,不会用。
以上不知其意,建议自行测试
5.nextGaussian()
/**
* nextGaussian()
* 从该随机数发生器的序列返回下一个伪随机数,高斯(“正”)分布 double值,平均值为 0.0 ,标准差为 1.0 。
* 返回值:double
*/
@Test
public void Test_nextGaussian()
{
for(int i = 1 ;i <= 100;i++)
{
System.out.print( i + "=" +r.nextGaussian() + " ");
if(i % 5 == 0)
System.out.println();
}
}
感觉和nextDouble(0差不多,暂时不了解两者的区别,优缺点
6.额外测试:边界测试
测试一 测试nextInt(100)的左右边界
//Random r = new Random();
int N = 0;//记录次数,直观反映运行多少次
//测试左边界
int ans;
while(true)
{
ans = r.nextInt(100);
N++;
System.out.println("第" + N +"次运行!");
if(ans == 0)
{
System.out.println("存在边界0,左闭!" );
break;
}
}//存在结束
此段程序运行几十次上百次会结束,说明有左边界0,
把if(ans == 0) 的0改成100,运行后发现一直运行,不跳出循环,大致能证明没有右边界100
注意
Math方法下面有一个random方法,由于Math方法在java.lang 包下面,所以不需要导包
使用方式:Math.random() 返回值是double,范围是0到1之间,边界问题由于数据量太大,不好测试,不过大概率是不包含边界,或者左闭右开。
有时候可以用强制性类型转换:(int)Math.random()*100 表示从0-100的随机数
注意Math.random() 等于new Random().nextDouble() 方法。