关于java的random函数产生26位字母的疑问

今天看书的时候看到一段关于利用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);这种方式呢?

所以说,我现在疑惑的问题就是这个了,如果我的分析有错,请各位指出。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值