java中判断随机数是否相同_1.24 Java周末总结 ①乘法数据的溢出 ②测试random随机数几率是否相等 ③判断字符串是否为纯数字...

一、乘法数据的溢出

背景:在算阶乘时,当数字太大后,结果为0,此时引出了数据在算乘法时数据的溢出  10!或者100!

byte   8位    8! = -27=-128 (转换到byte允许数据范围内)       9!等于8!    10!=0

short  16位   16!= -215(转换到short允许数据范围内)17!等于16!  18!=0

int    32位   32!=-231(转换到int允许数据范围内)  33!等于32!  34!=0

long  64位     64!=-263(转换到long允许数据范围内)65!等于64!  65!=0

说明在等于数据类型它自己的位数时,等于负的最小值,

在下一阶乘时也等于最小负值(n个数据一圈个数,比如byte就是n个28)

在下一阶乘时等于0,即n个半圈,比如byte类型就是n个128(27)

结论:算阶乘时即数据类型那位和下一位等于最小值,加2位为0

测试代码如下:

byte a = 1;

for(byte n = 1; n < 100;n++){

a = (byte)(a * n);

System.out.println(n+"!"+"="+a);

}

int b = 1;

for(int n = 1; n < 100;n++){

b = (int)(b * n);

System.out.println(n+"!"+"="+b);

}

测试结果如下:

1928822b60406882ab736452e701bb71.png

0b1e15fa7256b741ca5bd7a22835f254.png

同理,short和long型一样;double因为有小数,所以结果是无穷大,结果如下

4ea2cda722b7fbc86e7b5753d4bc16ab.png

根据结果可改成如下的数学表达式,还没有推理证实

int sum = 1*2*3*4*.......*32 = -231+n*232  (n为正整数,且这是0到32以内第一个可以表达的,即乘到32时n为可以的最小正整数,)

byte sum = 1*2*3*...*8   = -128+n*28

二、测试random随机数几率是否相等

背景,在调用系统随机数产生的时候,不清楚源代码,想测试一下随机数的概率

测试代码如下:

public class Random_Test {

public static void main(String[] args) {

int random = 0;

int times = 10000000;//生成随机数的次数

int random_Range = 100;//生成随机数的范围

int[] arry = new int[random_Range];

for (int i = 0; i < times; i++) {

random = (int) (Math.random() * random_Range);

arry[random] += 1;生成的随机数是多少,对应的就+1

}

for (int i = 0; i < random_Range; i++) {

System.out.println("arry[" + i + "]" + arry[i] + "\t\t" + arry[i] * 100.0 / times + "%");

}

System.out.println("产生的数字 次数\t\t百分比");

System.out.println("理论次数"+times/random_Range+"\t\t"+"理论百分比"+1.0/random_Range*100+"%");

}

}

测试结果如下:

1f385cb8957513a6b9f0961365ae216f.png

三、判断数字是否为纯数字:

思路:取出每一位,判断是否为0-9,不是则跳出,返回false

下面是网上搜一些代码:

ava中判断字符串是否为数字的方法:

1.用JAVA自带的函数

public static boolean isNumeric(String str){

for (int i = 0; i < str.length(); i++){

System.out.println(str.charAt(i));//转换为字符

if (!Character.isDigit(str.charAt(i))){//判断是否为数字,同理包含的方法有是否为字母(大小写字母),是否为字母或数字,是否为空白字符

return false;

}

}

return true;

}

2.用正则表达式

首先要import java.util.regex.Pattern 和 java.util.regex.Matcher

public boolean isNumeric(String str){

Pattern pattern = Pattern.compile("[0-9]*");

Matcher isNum = pattern.matcher(str);

if( !isNum.matches() ){

return false;

}

return true;

}

第1种方式只能校验不含负号“-”的数字,即输入一个负数-199,输出结果将是false;

而第二方式则可以通过修改正则表达式实现校验负数,将正则表达式修改为“^-?[0-9]+”即可,修改为“-?[0-9]+.?[0-9]+”即可匹配所有数字。

方法一:利用正则表达式

public static void main(String[] args){

String str="123456";

boolean result=str.matches("[0-9]+");

if (result == true) {

System.out.println("该字符串是纯数字");

}else{

System.out.println("该字符串不是纯数字");

}

}

方法二:利用Pattern.

import java.util.regex.Matcher;

import java.util.regex.Pattern;

public class Testone {

public static void main(String[] args){

String str="123456";

Pattern pattern = Pattern.compile("[0-9]{1,}");

Matcher matcher = pattern.matcher((CharSequence)str);

boolean result=matcher.matches();

if (result == true) {

System.out.println("该字符串是纯数字");

}else{

System.out.println("该字符串不是纯数字");

}

}

}

方法一:用JAVA自带的函数

public static boolean isNumeric(String str){

for (int i = str.length();--i>=0;){

if (!Character.isDigit(str.charAt(i))){

return false;

}

}

return true;

}

方法二:

/*

* 判断是否为整数

* @param str 传入的字符串

* @return 是整数返回true,否则返回false

*/

public static boolean isInteger(String str) {

Pattern pattern = Pattern.compile("^[-\\+]?[\\d]*$");

return pattern.matcher(str).matches();

}

方法三:

public static boolean isNumeric(String str){

Pattern pattern = Pattern.compile("[0-9]*");

return pattern.matcher(str).matches();

}

方法四:

public final static boolean isNumeric(String s) {

if (s != null && !"".equals(s.trim())) {

return s.matches("^[0-9]*$");

}else{

return false;

}

}

3方法五:用ascii码

public static boolean isNumeric(String str){

for(int i=str.length();--i>=0;){

int chr=str.charAt(i);   // char转换为int后为它的ASCII值

if(chr<48 || chr>57)

return false;

}

return true;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值