【问题标题】:Is this an elegant solution? [closed]这是一个优雅的解决方案吗? [关闭]
【发布时间】:2016-02-29 18:20:12
【问题描述】:

问题并不复杂。从名称数组中随机记录一个名称。

我的解决方案是这样的。

var names = [ 'nick', 'rock', 'danieel' ];
function randPicker(names) {
    var randNum = Math.floor((Math.random() * 10));
    var name = randNum <= (names.length - 1) ? console.log(names[randNum]) : randPicker(arguments[0]); 
};

在我看来,这段代码并不那么漂亮,因为我很确定有更好的方法可以执行得更快。这是真的吗?

【问题讨论】:

  • else部分直到世界末日才会执行。
  • 只需使用names[Math.floor(Math.random() * names.length)]
  • 最好使用console.log(names[Math.floor((Math.random() * names.length))],无需检查。
  • 这是一个适合代码审查的问题。

标签: javascript arrays random


【解决方案1】:

更好的方法是让函数返回数组的随机元素并修复它的获取:

function randPicker(a) {
  return a[Math.random() * a.length | 0];
}

还有测试:

function randPicker(a) {
  return a[Math.random() * a.length | 0];
}

var names = ['nick', 'rock', 'danieel'];

for (var q=0; q<16; ++q) {
  console.log(randPicker(names));
}

【讨论】:

  • 在我看来这是一个非常有趣的解决方案。但是竖线 ' | ' ?你有没有用它来返回一个默认值?
  • @user2300068,不,我用它来强制转换为 int32 :)
【解决方案2】:

您可以立即获取 randNum 以检索名称:

var names = [ 'nick', 'rock', 'danieel' ];
function randPicker(names) {
    var randNum = Math.floor((Math.random() * names.length));
    var name = console.log(names[randNum]); 
};

【讨论】:

    【解决方案3】:

    你可以使用

    var names = [ 'nick', 'rock', 'danieel' ];
    
    function randomPicker(names) {
     return names[Math.floor(Math.random() * (names.length+1))];
    }
    

    说明:

    Math.random() 返回 [0,1] 范围内的数字 将它乘以array + 1 的长度,得到[0,length] 范围内的带小数的数字。 最后使用Math.floor 将其四舍五入。

    【讨论】:

    • 但是length不在数组里面,所以不应该加1。
    • 并且1不包括在内。
    猜你喜欢
    • 1970-01-01
    • 2021-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-22
    • 2018-04-28
    • 1970-01-01
    • 2017-10-31
    相关资源
    最近更新 更多