关于java的random函数产生26位字母的疑问
2018-02-04 15:31
363 查看
今天看书的时候看到一段关于利用java的random函数产生26个英文字母的例子,首先书上是这样写的
String charString=new String("abcdefghijklmnopqrstuvwxyz");
int charNumber=((int)(Math.random()*100)+1)%26-1;
Character TempCharacter=new Character(charString.charAt(charNumber));
书上是说这样可以随机产生1~26之间的整数数字,再以这个整数数字为下标去对应字母的字符串中字符。
但是这时候我看这段代码产生了一些疑问,为何这样写法可以产生1~26之间的整数数字?
我们知道,平常产生1~26位整数数字最简单的方法应该是int charNumber=((int)(Math.random()*26)+1);。
我是这样解读书上的代码的,首先Math.random()产生[0,1)之间的double型数字,随后Math.random()*100)则变成了产生[0,100),((int)(Math.random()*100)+1)则产生[1,101)之间的整数数字,即1,2,3....100。
随后的((int)(Math.random()*100)+1)%26我是这样分析的,先把这100个数分成四份,1~26,27~52,53~78,79~100,其中第一份1~26被26取余,则得出的数据分别为1、2、...24、25、0这26个数字,第二份取余结果同样是1、2、...、24、25、0这26个数字,第三份取余结果也是1、2、...、24、25、0这26个数字,而第四份的取余结果则是1、2、...、20、21、22这22个数字。
这样问题就来了,这样的写法的确只会随机产生26个数字,但首先原本的100个数都是随机产生的,就是说每个数的产生概率为1%,但现在把这100个数平均分为4份,那个这26个数字就只有前22个数字,即1、2、3、...22产生概率相同,即每个数字随机产生概率为4%,而23、24、25、26这四个数字随机产生概率为3%。这样分析的话,那不就表明这种方式产生字母的随机性是存在一定的误差的么?那为何当初不直接使用int
charNumber=((int)(Math.random()*26)+1);这种方式呢?
所以说,我现在疑惑的问题就是这个了,如果我的分析有错,请各位指出。
String charString=new String("abcdefghijklmnopqrstuvwxyz");
int charNumber=((int)(Math.random()*100)+1)%26-1;
Character TempCharacter=new Character(charString.charAt(charNumber));
书上是说这样可以随机产生1~26之间的整数数字,再以这个整数数字为下标去对应字母的字符串中字符。
但是这时候我看这段代码产生了一些疑问,为何这样写法可以产生1~26之间的整数数字?
我们知道,平常产生1~26位整数数字最简单的方法应该是int charNumber=((int)(Math.random()*26)+1);。
我是这样解读书上的代码的,首先Math.random()产生[0,1)之间的double型数字,随后Math.random()*100)则变成了产生[0,100),((int)(Math.random()*100)+1)则产生[1,101)之间的整数数字,即1,2,3....100。
随后的((int)(Math.random()*100)+1)%26我是这样分析的,先把这100个数分成四份,1~26,27~52,53~78,79~100,其中第一份1~26被26取余,则得出的数据分别为1、2、...24、25、0这26个数字,第二份取余结果同样是1、2、...、24、25、0这26个数字,第三份取余结果也是1、2、...、24、25、0这26个数字,而第四份的取余结果则是1、2、...、20、21、22这22个数字。
这样问题就来了,这样的写法的确只会随机产生26个数字,但首先原本的100个数都是随机产生的,就是说每个数的产生概率为1%,但现在把这100个数平均分为4份,那个这26个数字就只有前22个数字,即1、2、3、...22产生概率相同,即每个数字随机产生概率为4%,而23、24、25、26这四个数字随机产生概率为3%。这样分析的话,那不就表明这种方式产生字母的随机性是存在一定的误差的么?那为何当初不直接使用int
charNumber=((int)(Math.random()*26)+1);这种方式呢?
所以说,我现在疑惑的问题就是这个了,如果我的分析有错,请各位指出。
相关文章推荐
- java ---- 数学函数Math和随机产生数值Random
- 用java中的Math.random()函数产生一个简单的随机字符串
- 关于java中servlet中的路径的几个函数的例子
- 关于Java日期处理函数.[不断更新]
- java中关于时间日期操作的常用函数
- java中关于时间日期操作的常用函数
- 关于java调用window DLL里的函数的总结
- java中关于时间日期操作的常用函数
- Java中关于抽象类abstract class的疑问
- 关于Random产生随机数测试
- java中关于时间日期操作的常用函数(转摘)
- 几个关于随机数组产生的函数 包括各类可重复或不重复
- 关于java日期的函数
- java中关于时间日期操作地常用函数
- java中关于时间日期操作的常用函数
- 关于一个Java时间函数的转换方法
- 使用Random函数产生随机数
- 关于java窗口关闭的疑问
- java中关于时间日期操作的常用函数
- 关于 java 中 Double 型 用于计算产生的误差举例 ,应该用BigDecimal代替Double