随机生成6位数字,你会怎么写?

1,081 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第2天,点击查看活动详情

假如让你随机生成一个数字,比如6位数字,你会怎么做?

for循环

粗暴实现

function forFn() {
    let str = ''; 
    let target = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]; 
    let length = 6;
    for (var i = 0; i < 6; i++) {
        str += target[Math.floor(Math.random() * 10)];
    }
    return str;
}
forFn() // 649659
forFn() // 273930
forFn() // 902204

原理很简单,就是循环6次,每次随机一个数字拼接在一起最终返回。这样写的话函数是死的,目标数字和生成的字符串长度固定死了。

参数抽离

function forFn(target, length) {
    let str = ''; 
    for (var i = 0; i < 6; i++) {
        str += target[Math.floor(Math.random() * 10)];
    }
    return str;
}
forFn([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], 6)

将参数抽离出来后,我们可以在调用的时候传入我们想要随机出现的数字,和输出的数字字符串长度。如果是常用的不怎么变的参数,我们可以用默认参数代替,避免每次都要传。以上的数组传起来可有点麻瓜啊...

默认参数

function forFn(length,target = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) {
    let str = ''; 
    for (var i = 0; i < 6; i++) {
        str += target[Math.floor(Math.random() * 10)];
    }
    return str;
}
forFn(6)

默认参数要放在非默认参数的后面,因为参数是有顺序的,不然就会像下面这样:

错误的默认参数示范

function forFn(target = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], length) {
    let str = ''; 
    for (var i = 0; i < 6; i++) {
        str += target[Math.floor(Math.random() * 10)];
    }
    return str;
}
forFn(6)

这里参数传6可不是对应的length啊,兄嘚,对应的是target去了。length在这里是undefined了。

截取随机数

function sliceFn(length) {
    let str = Math.random();  // 0.287365152732
    str = str.toString(); // '0.287365152732'
    str = str.slice(2, 2 + length) // '287365'
    return str;
}
sliceFn(6)

这种方法貌似简单一些,但是有个问题是随机的数字智能在0-9之间出现,有时候需求是一个16进制数,比如色值。这种情况下以上方法就芭比Q了。

任意进制数

首先先科普下toString方法,我们平时用toString方法基本不会往里面传参数,实际上,可以传一个数字,代表要转化成某种进制数。比如16进制,2进制等等。

toString进制转换

let a = 2, b = 11;
a.toString(2) // '10'
b.toString(16) // 'b'

抽离出进制数的参数

function sliceAnyFn(length = 6, base = 10) {
    let str = Math.random();
    str = str.toString(base);
    str = str.slice(2, 2 + length)
    return str;
}
sliceAnyFn() // '525783'

简化函数,测试结果

function sliceAnyFn(length = 6, base = 10) {
    return str = Math.random().toString(base).slice(2, 2 + length);
}
sliceAnyFn() // '942204'
sliceAnyFn(6,2) // '110111'
sliceAnyFn(6,8) // '075611'
sliceAnyFn(8,16) // '95cff2ab'

试试100进制

function sliceAnyFn(length = 6, base = 10) {
    return str = Math.random().toString(base).slice(2, 2 + length);
}
sliceAnyFn(6,100) // toString() radix argument must be between 2 and 36

ea83fbdca877a8b289c56b7413d2faf.png

错误提示可真友好,如你所见,参数只能限定在2-36之间。

结语

以上就是今天的全部内容,有更好的随机数生成方法欢迎留言评论,感谢阅读。