关于使用Math.random方法得到某个范围的字符的疑惑

PogbaLiu 2015-12-20 04:28:10
加精
public class MathRandomChar {
public static char GetRandomChar(char ch1,char ch2){
return (char)(ch1+Math.random()*(ch2-ch1+1));
}
public static void main(String args[]){
//获取a~z之间的随机字符
System.out.println("任意小写字符:"+GetRandomChar('a','z'));
//获取A~Z之间的随机字符
System.out.println("任意大写字符:"+GetRandomChar('A','Z'));
//获取0~9之间的随机字符
System.out.println("0到9任意数字字符:"+GetRandomChar('0','9'));
}
}


如上面的一个获取任意字符之间的随机字符的代码,我疑惑的是定义静态方法GetRandomChar方法时,为什么Math.random()*(ch2-ch1+1)这一段代码改成Math.random()*(ch2+1)就无法按目的获得任意字符,改后的代码会生成要求范围外的字符,想问问这样两种写法为什么会有区别,难道我的理解有误,求教各位老师,谢谢!
...全文
3110 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
PogbaLiu 2016-01-11
  • 打赏
  • 举报
回复
引用 18 楼 Alex_3409 的回复:
[quote=引用 14 楼 qq_29838777的回复:][quote=引用 13 楼 Alex_3409 的回复:] [quote=引用 6 楼 qq_29838777 的回复:] [quote=引用 3 楼 Alex_3409 的回复:] [quote=引用 2 楼 Tredemere 的回复:] Math.random()获得的是(0,1)之间的小数,这里的方法主要是利用ASCII码来计算的,ch2-ch1+1表示的是在ASCII码表中ch1和ch2之间的间隔。 那么(ch2-ch1+1)*Math.random() 这个数必然大于0 小于ch2-ch1+1 ,最后加上ch1,和在ch2和ch1之间,你要理解ch2-ch1+1是什么意思。 你写的Math.random()*(ch2+1)求得是ch2相对于ASCII边的第一个字符的距离,那么求出的是ASCII从第一个字符到ch2之间的任意字符了
同意楼上。 写代码的时候要知道自己在写什么以及为什么要这样写,这道题其实只是简单的运用了ASCⅡ的加减运算,和生活中的计算没有太大的区别,只要你能想到这点,其实并不难理解。 共勉[/quote]你好,我发现了一个诡异的现象,欢迎你看看我最近的回复,有程序运行结果,出现了一个诡异的结果[/quote] java采用unicode,但是8位的ASCII码包含在Unicode中,是从0~127的。超过127就表示其他的字符了[/quote]但是为什么超过127的,进行char类型强制转换后打印出来都是‘?’字符[/quote] 超过127之后他表示的是其他字符,这些字符(汉字除外)平常都用不上,而且他们主要表示的是其他语言(人类语言)的字符,原因可能是你的电脑系统并不支持这些字符,故输出?[/quote]
引用 18 楼 Alex_3409 的回复:
[quote=引用 14 楼 qq_29838777的回复:][quote=引用 13 楼 Alex_3409 的回复:] [quote=引用 6 楼 qq_29838777 的回复:] [quote=引用 3 楼 Alex_3409 的回复:] [quote=引用 2 楼 Tredemere 的回复:] Math.random()获得的是(0,1)之间的小数,这里的方法主要是利用ASCII码来计算的,ch2-ch1+1表示的是在ASCII码表中ch1和ch2之间的间隔。 那么(ch2-ch1+1)*Math.random() 这个数必然大于0 小于ch2-ch1+1 ,最后加上ch1,和在ch2和ch1之间,你要理解ch2-ch1+1是什么意思。 你写的Math.random()*(ch2+1)求得是ch2相对于ASCII边的第一个字符的距离,那么求出的是ASCII从第一个字符到ch2之间的任意字符了
同意楼上。 写代码的时候要知道自己在写什么以及为什么要这样写,这道题其实只是简单的运用了ASCⅡ的加减运算,和生活中的计算没有太大的区别,只要你能想到这点,其实并不难理解。 共勉[/quote]你好,我发现了一个诡异的现象,欢迎你看看我最近的回复,有程序运行结果,出现了一个诡异的结果[/quote] java采用unicode,但是8位的ASCII码包含在Unicode中,是从0~127的。超过127就表示其他的字符了[/quote]但是为什么超过127的,进行char类型强制转换后打印出来都是‘?’字符[/quote] 超过127之后他表示的是其他字符,这些字符(汉字除外)平常都用不上,而且他们主要表示的是其他语言(人类语言)的字符,原因可能是你的电脑系统并不支持这些字符,故输出?[/quote]好吧,这估计涉及到字符编码的问题了
Alex_3409 2016-01-08
  • 打赏
  • 举报
回复
引用 14 楼 qq_29838777的回复:
[quote=引用 13 楼 Alex_3409 的回复:] [quote=引用 6 楼 qq_29838777 的回复:] [quote=引用 3 楼 Alex_3409 的回复:] [quote=引用 2 楼 Tredemere 的回复:] Math.random()获得的是(0,1)之间的小数,这里的方法主要是利用ASCII码来计算的,ch2-ch1+1表示的是在ASCII码表中ch1和ch2之间的间隔。 那么(ch2-ch1+1)*Math.random() 这个数必然大于0 小于ch2-ch1+1 ,最后加上ch1,和在ch2和ch1之间,你要理解ch2-ch1+1是什么意思。 你写的Math.random()*(ch2+1)求得是ch2相对于ASCII边的第一个字符的距离,那么求出的是ASCII从第一个字符到ch2之间的任意字符了
同意楼上。 写代码的时候要知道自己在写什么以及为什么要这样写,这道题其实只是简单的运用了ASCⅡ的加减运算,和生活中的计算没有太大的区别,只要你能想到这点,其实并不难理解。 共勉[/quote]你好,我发现了一个诡异的现象,欢迎你看看我最近的回复,有程序运行结果,出现了一个诡异的结果[/quote] java采用unicode,但是8位的ASCII码包含在Unicode中,是从0~127的。超过127就表示其他的字符了[/quote]但是为什么超过127的,进行char类型强制转换后打印出来都是‘?’字符[/quote] 超过127之后他表示的是其他字符,这些字符(汉字除外)平常都用不上,而且他们主要表示的是其他语言(人类语言)的字符,原因可能是你的电脑系统并不支持这些字符,故输出?
Sacrix 2015-12-30
  • 打赏
  • 举报
回复
ch2-ch1+1和ch2+1显然不等价 把字母ascii代入进去就知道
livend 2015-12-30
  • 打赏
  • 举报
回复
ch1+Math.random()*(ch2+1) 也是有边界的啊,只是不是ch1--ch2 而是ch1+ch2。 a+b
PogbaLiu 2015-12-27
  • 打赏
  • 举报
回复
引用 13 楼 Alex_3409 的回复:
[quote=引用 6 楼 qq_29838777 的回复:] [quote=引用 3 楼 Alex_3409 的回复:] [quote=引用 2 楼 Tredemere 的回复:] Math.random()获得的是(0,1)之间的小数,这里的方法主要是利用ASCII码来计算的,ch2-ch1+1表示的是在ASCII码表中ch1和ch2之间的间隔。 那么(ch2-ch1+1)*Math.random() 这个数必然大于0 小于ch2-ch1+1 ,最后加上ch1,和在ch2和ch1之间,你要理解ch2-ch1+1是什么意思。 你写的Math.random()*(ch2+1)求得是ch2相对于ASCII边的第一个字符的距离,那么求出的是ASCII从第一个字符到ch2之间的任意字符了
同意楼上。 写代码的时候要知道自己在写什么以及为什么要这样写,这道题其实只是简单的运用了ASCⅡ的加减运算,和生活中的计算没有太大的区别,只要你能想到这点,其实并不难理解。 共勉[/quote]你好,我发现了一个诡异的现象,欢迎你看看我最近的回复,有程序运行结果,出现了一个诡异的结果[/quote] java采用unicode,但是8位的ASCII码包含在Unicode中,是从0~127的。超过127就表示其他的字符了[/quote]但是为什么超过127的,进行char类型强制转换后打印出来都是‘?’字符
Alex_3409 2015-12-26
  • 打赏
  • 举报
回复
引用 6 楼 qq_29838777 的回复:
[quote=引用 3 楼 Alex_3409 的回复:] [quote=引用 2 楼 Tredemere 的回复:] Math.random()获得的是(0,1)之间的小数,这里的方法主要是利用ASCII码来计算的,ch2-ch1+1表示的是在ASCII码表中ch1和ch2之间的间隔。 那么(ch2-ch1+1)*Math.random() 这个数必然大于0 小于ch2-ch1+1 ,最后加上ch1,和在ch2和ch1之间,你要理解ch2-ch1+1是什么意思。 你写的Math.random()*(ch2+1)求得是ch2相对于ASCII边的第一个字符的距离,那么求出的是ASCII从第一个字符到ch2之间的任意字符了
同意楼上。 写代码的时候要知道自己在写什么以及为什么要这样写,这道题其实只是简单的运用了ASCⅡ的加减运算,和生活中的计算没有太大的区别,只要你能想到这点,其实并不难理解。 共勉[/quote]你好,我发现了一个诡异的现象,欢迎你看看我最近的回复,有程序运行结果,出现了一个诡异的结果[/quote] java采用unicode,但是8位的ASCII码包含在Unicode中,是从0~127的。超过127就表示其他的字符了
PogbaLiu 2015-12-25
  • 打赏
  • 举报
回复
引用 11 楼 Tredemere 的回复:
[quote=引用 10 楼 qq_29838777的回复:][quote=引用 9 楼 Tredemere 的回复:] [quote=引用 8 楼 qq_29838777的回复:][quote=引用 7 楼 abcdefghiijklmnopqrs 的回复:] 是(char)(ch1+Math.random()*(ch2-ch1+1))不是ch1+Math.random()*(ch2+1) 如果Math.random()得到0.999-->ch1+Math.random()*(ch2+1)约等于ch1+ch2+1不在ch1-ch2之间 '0'的ascii 48 ‘9’的ascii 57 如果按你那样写得到的是48-106 ‘Y’的ascii 89在48-106所以输出正常
我知道我那样写不正确,但是你看小写字符那一项,出现了一个比‘a’ASCII码更低的字符, 但是 ‘a'的ASCII为96 ‘z'的ASCII为122 按我那样写的范围是 96-219,也不会是出现ASCII为63的’?‘ 还有,如果代码正确的写成(ch2-ch1+1),就不会像上面出现低于最小ASCII的情况, 请问这是怎么回事? [/quote] 那个不是更低,而是你超过了127,java的char类型超过127的都会输出?[/quote]学习了,谢谢!意思就是ASCII超过127的char类型都会输出‘?’,对吧[/quote] 我查了下,超过128应该是Unicode,不一定输出"?"。应该属于utf-16,这个你可以了解下。[/quote]我试了一下,直接对大于128的整数强制转换为char类型,打印出来的都是‘?’
zhenxianyimeng 2015-12-22
  • 打赏
  • 举报
回复
引用 10 楼 qq_29838777的回复:
[quote=引用 9 楼 Tredemere 的回复:] [quote=引用 8 楼 qq_29838777的回复:][quote=引用 7 楼 abcdefghiijklmnopqrs 的回复:] 是(char)(ch1+Math.random()*(ch2-ch1+1))不是ch1+Math.random()*(ch2+1) 如果Math.random()得到0.999-->ch1+Math.random()*(ch2+1)约等于ch1+ch2+1不在ch1-ch2之间 '0'的ascii 48 ‘9’的ascii 57 如果按你那样写得到的是48-106 ‘Y’的ascii 89在48-106所以输出正常
我知道我那样写不正确,但是你看小写字符那一项,出现了一个比‘a’ASCII码更低的字符, 但是 ‘a'的ASCII为96 ‘z'的ASCII为122 按我那样写的范围是 96-219,也不会是出现ASCII为63的’?‘ 还有,如果代码正确的写成(ch2-ch1+1),就不会像上面出现低于最小ASCII的情况, 请问这是怎么回事? [/quote] 那个不是更低,而是你超过了127,java的char类型超过127的都会输出?[/quote]学习了,谢谢!意思就是ASCII超过127的char类型都会输出‘?’,对吧[/quote] 我查了下,超过128应该是Unicode,不一定输出"?"。应该属于utf-16,这个你可以了解下。
PogbaLiu 2015-12-22
  • 打赏
  • 举报
回复
引用 9 楼 Tredemere 的回复:
[quote=引用 8 楼 qq_29838777的回复:][quote=引用 7 楼 abcdefghiijklmnopqrs 的回复:] 是(char)(ch1+Math.random()*(ch2-ch1+1))不是ch1+Math.random()*(ch2+1) 如果Math.random()得到0.999-->ch1+Math.random()*(ch2+1)约等于ch1+ch2+1不在ch1-ch2之间 '0'的ascii 48 ‘9’的ascii 57 如果按你那样写得到的是48-106 ‘Y’的ascii 89在48-106所以输出正常
我知道我那样写不正确,但是你看小写字符那一项,出现了一个比‘a’ASCII码更低的字符, 但是 ‘a'的ASCII为96 ‘z'的ASCII为122 按我那样写的范围是 96-219,也不会是出现ASCII为63的’?‘ 还有,如果代码正确的写成(ch2-ch1+1),就不会像上面出现低于最小ASCII的情况, 请问这是怎么回事? [/quote] 那个不是更低,而是你超过了127,java的char类型超过127的都会输出?[/quote]学习了,谢谢!意思就是ASCII超过127的char类型都会输出‘?’,对吧
zhenxianyimeng 2015-12-22
  • 打赏
  • 举报
回复
引用 8 楼 qq_29838777的回复:
[quote=引用 7 楼 abcdefghiijklmnopqrs 的回复:] 是(char)(ch1+Math.random()*(ch2-ch1+1))不是ch1+Math.random()*(ch2+1) 如果Math.random()得到0.999-->ch1+Math.random()*(ch2+1)约等于ch1+ch2+1不在ch1-ch2之间 '0'的ascii 48 ‘9’的ascii 57 如果按你那样写得到的是48-106 ‘Y’的ascii 89在48-106所以输出正常
我知道我那样写不正确,但是你看小写字符那一项,出现了一个比‘a’ASCII码更低的字符, 但是 ‘a'的ASCII为96 ‘z'的ASCII为122 按我那样写的范围是 96-219,也不会是出现ASCII为63的’?‘ 还有,如果代码正确的写成(ch2-ch1+1),就不会像上面出现低于最小ASCII的情况, 请问这是怎么回事? [/quote] 那个不是更低,而是你超过了127,java的char类型超过127的都会输出?
PogbaLiu 2015-12-22
  • 打赏
  • 举报
回复
引用 7 楼 abcdefghiijklmnopqrs 的回复:
是(char)(ch1+Math.random()*(ch2-ch1+1))不是ch1+Math.random()*(ch2+1) 如果Math.random()得到0.999-->ch1+Math.random()*(ch2+1)约等于ch1+ch2+1不在ch1-ch2之间 '0'的ascii 48 ‘9’的ascii 57 如果按你那样写得到的是48-106 ‘Y’的ascii 89在48-106所以输出正常
我知道我那样写不正确,但是你看小写字符那一项,出现了一个比‘a’ASCII码更低的字符, 但是 ‘a'的ASCII为96 ‘z'的ASCII为122 按我那样写的范围是 96-219,也不会是出现ASCII为63的’?‘ 还有,如果代码正确的写成(ch2-ch1+1),就不会像上面出现低于最小ASCII的情况, 请问这是怎么回事?
  • 打赏
  • 举报
回复
是(char)(ch1+Math.random()*(ch2-ch1+1))不是ch1+Math.random()*(ch2+1) 如果Math.random()得到0.999-->ch1+Math.random()*(ch2+1)约等于ch1+ch2+1不在ch1-ch2之间 '0'的ascii 48 ‘9’的ascii 57 如果按你那样写得到的是48-106 ‘Y’的ascii 89在48-106所以输出正常
PogbaLiu 2015-12-22
  • 打赏
  • 举报
回复
引用 3 楼 Alex_3409 的回复:
[quote=引用 2 楼 Tredemere 的回复:] Math.random()获得的是(0,1)之间的小数,这里的方法主要是利用ASCII码来计算的,ch2-ch1+1表示的是在ASCII码表中ch1和ch2之间的间隔。 那么(ch2-ch1+1)*Math.random() 这个数必然大于0 小于ch2-ch1+1 ,最后加上ch1,和在ch2和ch1之间,你要理解ch2-ch1+1是什么意思。 你写的Math.random()*(ch2+1)求得是ch2相对于ASCII边的第一个字符的距离,那么求出的是ASCII从第一个字符到ch2之间的任意字符了
同意楼上。 写代码的时候要知道自己在写什么以及为什么要这样写,这道题其实只是简单的运用了ASCⅡ的加减运算,和生活中的计算没有太大的区别,只要你能想到这点,其实并不难理解。 共勉[/quote]你好,我发现了一个诡异的现象,欢迎你看看我最近的回复,有程序运行结果,出现了一个诡异的结果
PogbaLiu 2015-12-22
  • 打赏
  • 举报
回复
引用 2 楼 Tredemere 的回复:
Math.random()获得的是(0,1)之间的小数,这里的方法主要是利用ASCII码来计算的,ch2-ch1+1表示的是在ASCII码表中ch1和ch2之间的间隔。
那么(ch2-ch1+1)*Math.random() 这个数必然大于0 小于ch2-ch1+1 ,最后加上ch1,和在ch2和ch1之间,你要理解ch2-ch1+1是什么意思。
你写的Math.random()*(ch2+1)求得是ch2相对于ASCII边的第一个字符的距离,那么求出的是ASCII从第一个字符到ch2之间的任意字符了
我当初也是这么想的,如你所说,整个式子按照数学式子的范围理解就行,但我发现一种结果,就是获得a~z的随机字符,如果按代码来说,即使我写成Math.random()*(ch2+1),获得的随机字符的ASCII码也应该在97以上,但是我却发现得到的字符的ASCII会有小于97的,所以这一现象使我对我自己的假设产生了疑问,而我一开始的假设就如你所说的一样。我截图给你看看,那个诡异的随机符

alan19931103 2015-12-20
  • 打赏
  • 举报
回复
一次函数和正比例函数怎么可能是一样的
Alex_3409 2015-12-20
  • 打赏
  • 举报
回复
引用 2 楼 Tredemere 的回复:
Math.random()获得的是(0,1)之间的小数,这里的方法主要是利用ASCII码来计算的,ch2-ch1+1表示的是在ASCII码表中ch1和ch2之间的间隔。 那么(ch2-ch1+1)*Math.random() 这个数必然大于0 小于ch2-ch1+1 ,最后加上ch1,和在ch2和ch1之间,你要理解ch2-ch1+1是什么意思。 你写的Math.random()*(ch2+1)求得是ch2相对于ASCII边的第一个字符的距离,那么求出的是ASCII从第一个字符到ch2之间的任意字符了
同意楼上。 写代码的时候要知道自己在写什么以及为什么要这样写,这道题其实只是简单的运用了ASCⅡ的加减运算,和生活中的计算没有太大的区别,只要你能想到这点,其实并不难理解。 共勉
zhenxianyimeng 2015-12-20
  • 打赏
  • 举报
回复
Math.random()获得的是(0,1)之间的小数,这里的方法主要是利用ASCII码来计算的,ch2-ch1+1表示的是在ASCII码表中ch1和ch2之间的间隔。 那么(ch2-ch1+1)*Math.random() 这个数必然大于0 小于ch2-ch1+1 ,最后加上ch1,和在ch2和ch1之间,你要理解ch2-ch1+1是什么意思。 你写的Math.random()*(ch2+1)求得是ch2相对于ASCII边的第一个字符的距离,那么求出的是ASCII从第一个字符到ch2之间的任意字符了
  • 打赏
  • 举报
回复
如果Math.random()得到0.999-->ch1+Math.random()*(ch2+1)约等于ch1+ch2+1不在ch1-ch2之间

62,612

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧