先看一道编程题

编写一个返回长度为N的随机数字符串的函数。

参考答案是这样的:

function random(n){
let max = 1;
for(let i=0;i<n;I++){
max*=10;}
return function(){
let str = "+parseInt(Math.random() * max);
let count = n - str.length;
for(let i = 0; i<count;i++){ str += '0' }
return str
}   }

为了理解这个题,需要了解一个基础知识Math.random();

随机数 Math.random()

Math.random()方法返回大于等于 0 小于 1 的一个随机数。
函数返回范围是[0,1)

这是在控制台运行这个方法得到的结果:小数点后3次17位数字,3次16位,1次15位,

所以可以看作是随机的给出一个数,小数点后17位,有时末尾是0,没有显示形成的结果。

jquery 范围内 随机数 javascript随机函数_字符串


在实际应用常用来扩展获取0,1以外两个值之间的随机数,返回值为[min,max)。

var min =2; var max = 6; var random = Math.random()*(max - min) + min;
console.log("生成的随机数:" + random);

获取两个值之间的随机整数:

var min =2; var max = 6;
 var random = Math.floor( Math.random()*(max - min) )+ min;
console.log("生成的随机数:" + random);

回到那道编程题

  1. 参考答案,首先确定这个长度为n的随机数,最高位的权需要是10n,通过n次循环max * =10得到存到变量max中。通过parseInt(Math.random() * max);得到这个随机数,同空字符串相加隐式类型转换为字符串。
    但是会有这样的情况存在
  2. jquery 范围内 随机数 javascript随机函数_jquery 范围内 随机数_02

  3. 随机数紧跟小数点的数字是零,乘以max后得到的随机数长度小于n位。
    然后,参考答案里将字符串长度与n比较,差几位就在字符串后面用几个零补齐。
  4. 有朋友给出了一个说是更快的方法
  5. jquery 范围内 随机数 javascript随机函数_Math_03

  6. 这段代码的运行结果会有下面这种情况,是不符合题意的。
  7. jquery 范围内 随机数 javascript随机函数_字符串_04

  8. 并且,Math.random(),调用toString方法后从第三个开始截取,截掉小数点和小数点前面的零,显然也是没有考虑到小数点后,首位是零的情况如上图,然后拼接N次这样的数,(每次循环拼接一个随机数。)把数字拼接的很长,然后,str.slice(0,n) 又截断掉后面的,所以后面一步也是浪费了很多性能。
  9. 结合上面的分析和学习,我觉得还可以写出两种实现的方法
    1. 为避开,小数点后第一个数是零的情况,我将得到的随机数调用toString方法以后从后向前取n个字符组成的片段,然后通过Array.from()转成数组好利用数组的reverse方法。翻转后,再用join方法连接,转回字符串。
function random(n) {
        let str = '';
        str = Math.random().toString().slice(-n);
        console.log(str);
        str = Array.from(str).reverse().join("");
        console.log(str);
        console.log(typeof(str));
        return str;
    }
    // random(12);
    console.log(random(12));

2.利用上面的随机数的扩展,第一位,放置随机生成的1–9中的一个数,后面n-1位依次放置随机生成的一个0–9中的一个数,整个组成一个长度为n的随机数,再转为字符串,得到题设结果。

function random(n) {
            var min1 = 1;
            var min2 = 0;
            var max = 9;
            var random1 = Math.floor(Math.random() * (max - min1)) + min1;
            var random2 = Math.floor(Math.random() * (max - min2)) + min2;
            var str = "" + random1;
            while (str.length < n) {
                str += random2;
            }
            return str;
        }

        console.log(random(15));

这样得到的结果是
588888888888888 、 411111111111111、 622222222222222、233333333333333 看上去很呆板。

  • 实际上上面的随机数不能用变量存起来的,每一位要运行一次随机数方法的。
  • "+="字符串是从左往右依次增长的;字符串的第一位,要最先加上。
  • 随机数获得[min,max)之间整数的扩展方法,遇到转字符串的 ""+隐式类型转换,要注意用小括号括起来,
  • 这个题中max要取10

最终代码为:

function random(n) {
            var min1 = 1;
            var min2 = 0;
            var max = 10;
            var str = "" + (Math.floor(Math.random() * (max - min1)) + min1);
            console.log(str);
            while (str.length < n) {
                str += Math.floor(Math.random() * (max - min2)) + min2;
            }
            return str;
        }
        console.log(random(15));

jquery 范围内 随机数 javascript随机函数_字符串_05

随机数在案例中的运用还是很广泛的,像随机抽奖,打地鼠游戏随机选择洞口,贪吃蛇随机生成食物……,下面还有随机数基础上变化来得定制化随机数:
1 在不相邻的两个整数中取得一个随机数例:随机产生2或4中的一个数
var rand3 = Math.random() < 0.5 ? 2 : 4;
2 在不相邻的多个整数中产生一个随机数
结合函数参数数组,可编写在不相邻的多个整数中产生一个随机值的函数

function selectFromMess() {
 return arguments[Math.floor(Math.random() * arguments.length)]
 }
 //随机产生1、6、8中的一个数
 var rand4 = selectFromMess(1, 6, 8);
 //也可随机产生文本
 var randomTxt1 = selectFromMess(“安慰奖”, “二等奖”, “一等奖”);


扩展 随机数常相伴使用的方法
1. Math.round(); Math.floor();Math.ceil();

JavaScript: The Definitive Guide, 4th Edition中对三个函数的定义 :

Math.ceil(): round a number up
Arguments: Any numeric value or expression
Returns: The closest integer greater than or equal to x.


Math.floor(): round a number down
Arguments: Any numeric value or expression
Returns: The closest integer less than or equal to x.


Math.round(): round to the nearest integer
Arguments: Any number.
Returns: The integer closest to x.

jquery 范围内 随机数 javascript随机函数_字符串_06

  1. Math.ceil()用作向上取整。
  2. Math.floor()用作向下取整。
  3. Math.round() 我们数学中常用到的四舍五入取整。

2.JavaScript:标准内置对象函数属性–parseInt()

parseInt()函数将固定返回string以十进制时显示的数

parseInt(string, radix);

◆ string
要被解析的值。如果参数不是一个字符串,则将其转换为字符串(使用 ToString 抽象操作)。字符串开头的空白符将会被忽略。
◆ radix
一个介于2和36之间的整数(数学系统的基础),表示上述字符串的基数。比如参数"10"表示使用我们通常使用的十进制数值系统。始终指定此参数可以消除阅读该代码时的困惑并且保证转换结果可预测。当未指定基数时,不同的实现会产生不同的结果,通常将值默认为10。

返回值:
返回解析后的整数值。如果被解析参数的第一个字符无法被转化成数值类型,则返回 NaN。
☆ 注意:radix参数为n 将会把第一个参数看作是一个数的n进制表示,而返回的值则是十进制的。例如:parseInt('123', 5)

将’123’看作5进制数,返回十进制数38; 1 * 52 + 2 * 51 + 3 * 50 = 38

☆ 如果 parseInt 遇到了不属于radix参数所指定的基数中的字符那么该字符和其后的字符都将被忽略。接着返回已经解析的整数部分。parseInt 将截取整数部分。开头和结尾的空白符允许存在,会被忽略。
☆ 一些数中可能包含e字符(例如6.022e23),使用parseInt去截取包含e字符数值部分会造成难以预料的结果。例如:

parseInt("6.022e23", 10);        // 返回 6
parseInt(6.022e2, 10);          // 返回 602

☆ 如果第一个字符不能被转换成数字,parseInt返回NaN。