一个JavaScript的Math.random()问题
一个Get里面有个参数被加密了,是16位的随机数和crc32,随机数部分看了一下是有用到这一段JavaScript:Math.random().toString(10)....
一个Get里面有个参数被加密了,是16位的随机数和crc32,随机数部分看了一下是有用到这一段JavaScript:Math.random().toString(10).substring(2)我重新构建的是这样的:function random(){var random= Math.random().toString(10).substring(2);return random;}我重新构建输出的随机数时长时短的求各位大神帮忙看一下怎么样才能正确输出16位数字的随机数。附的图里面是网页部分JavaScript的Math.random().toString(10).substring(2)部分代码
问题里面的乱了,附我构建的JavaScript图。 展开
问题里面的乱了,附我构建的JavaScript图。 展开
1个回答
展开全部
这是因为JavaScript产生的随机数是个纯小数(大于等于0小于1的实数),但小数点后面的小数位数肯定不是固定16位的啊,比如 0.123 是3位小数,0.987654321 是9位小数。所以仅靠获取小数点后的数字就得到16位数的想法是不靠谱的。
正确的做法:第一种是把随机数乘以9再加1,就得到1到9.9999……的数字,再乘以10的15次方(也就是1后面15个0),最后取整,就得到1000……(1后面15个0,即最小的16位数)到9999……(16个9,即最大的16位数)之间的数字了:
function random(){
return parseInt((Math.random()*9+1)*Math.pow(10,15));
}
第二种是把16个1位数的随机整数拼在一起也就是16位数了:
function random(){
for(var s="",i=0;i<16;i++)s+=parseInt(Math.random()*10);
return s;
}
两种方法的区别在于,第一种产生的数字是纯的16位数(0不能作为开头),类型是数值,效率应该是较高的;第二种产生的数字则允许0开头,类型是字符串,效率相对差一些。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询