【问题标题】:Get a random item from a JavaScript array [duplicate]从 JavaScript 数组中获取随机项 [重复]
【发布时间】:2011-08-20 09:09:57
【问题描述】:
var items = Array(523, 3452, 334, 31, ..., 5346);

如何从items 获取随机物品?

【问题讨论】:

标签: javascript arrays random


【解决方案1】:
var item = items[Math.floor(Math.random()*items.length)];

【讨论】:

  • Math.random() 永远不会是 1,也不应该是 1。 最大的索引应该总是比长度小 1,否则你会得到一个 @987654322 @错误。
  • 优雅的解决方案。我测试了它:var items = ["a","e","i","o","u"] 987654324 for(var i = 0; i < 1000000; i++){ 987654326 if (objResults[randomElement]){ 987654328 }else{ 987654330 } 987654332 console.log(objResults)结果后百万迭代很随机:Object {u: 200222, o: 199543, a: 199936, e: 200183, i: 200116}
  • @AnkitPatial:这是一种“打乱”数组的方法,但问题是关于从数组中随机选择的元素。有很大的不同。
  • @virus Math.round 不是Math.floor 的有效替代品。使用round 会导致意外引用未定义的索引,例如Math.random() 是0.95 而items.length 是5。Math.round(0.95*5) 是5,这将是一个无效的索引。 floor(random) 在您的示例中始终为零。
  • 不错的答案。你可以更短:items[items.length * Math.random() | 0] :)
【解决方案2】:

1.解决方案:定义数组原型

Array.prototype.random = function () {
  return this[Math.floor((Math.random()*this.length))];
}

适用于内联数组

[2,3,5].random()

当然还有预定义的数组

var list = [2,3,5]
list.random()

2。解决方案:定义接受列表并返回元素的自定义函数

function get_random (list) {
  return list[Math.floor((Math.random()*list.length))];
}


get_random([2,3,5])

【讨论】:

  • @EvanCarroll 更好地参考一个有用的链接,而不是对诸如编码风格之类的主观概念投反对票,这不会使答案无效或“无用”! stackoverflow.com/questions/14034180/…
  • 赞成,因为在没有解释的情况下,向 Array.prototype 添加内容的反对票对任何人都没有用。
  • 向 Array.prototype 添加新函数的问题与添加全局变量的问题相同——某人/其他人可能对不同的事物使用相同的“名称”——这可能会导致微妙的混乱
  • 谢谢你。比键入整个香草公式或在代码多次需要它时调用自定义函数要有用。至于对冲突的有效担忧,这就是命名空间的用途:ns.ns_ 格式(如果适用)。
  • @Schmoo 我刚刚遇到了一种“微妙的混乱”情况。我将原型的名称缩短为“rand”。然后突然在for (let i in arr) 循环期间,它迭代所有预期的索引,并且还迭代“rand”的索引。不得不切换到for (let i=0,l=arr.length;i<l;i++) 循环来修复它。
【解决方案3】:

这是另一种方式:

function rand(items) {
    // "~~" for a closest "int"
    return items[~~(items.length * Math.random())];
}

或者如下@1248177推荐的:

function rand(items) {
    // "|" for a kinda "int div"
    return items[items.length * Math.random() | 0];
}

【讨论】:

  • 这是什么疯狂的~~?以前在 JS 中从未见过。
  • @hatboysam: do a search - 它本质上将操作数转换为最接近的整数。
  • 其实就是向下取整,比如Math.floor
  • 不错的答案。你仍然可以更短:items[items.length * Math.random() | 0] :)
  • “实际上,它向下取整,就像 Math.floor”@programmer5000。它实际上向 0 舍入,即 ~~(-1.5) 计算结果为 -1,而不是 Math.floor 给出的 -2。
【解决方案4】:

如果你真的必须使用 jQuery 来解决这个问题(注意:你不应该):

(function($) {
    $.rand = function(arg) {
        if ($.isArray(arg)) {
            return arg[$.rand(arg.length)];
        } else if (typeof arg === "number") {
            return Math.floor(Math.random() * arg);
        } else {
            return 4;  // chosen by fair dice roll
        }
    };
})(jQuery);

var items = [523, 3452, 334, 31, ..., 5346];
var item = jQuery.rand(items);

如果给定一个数组,这个插件将返回一个随机元素,或者一个来自 [0 .. n) 的值,给定一个数字,或者给定其他任何东西,保证随机值!

为了更有趣,数组返回是通过基于数组的长度递归调用函数生成的:)

http://jsfiddle.net/2eyQX/ 的工作演示

【讨论】:

  • @neoascetic 该行的重点是从数组中选择一个元素不是 jQuery 问题,它是通用 JS。
  • @damd re:您建议的编辑 - 这显然是不正确的,因为在 IIFE 中定义插件和使用插件之间有明显的区别。但是为了保持一致性,我将使用行中的$ 替换为jQuery
  • 当然。每行平均少于 3 个链式方法,并且每行至少使用一次 $,因此它没有足够的 jQuery。
  • 这不是需要jQuery的问题。
【解决方案5】:
const ArrayRandomModule = {
  // get random item from array
  random: function (array) {
    return array[Math.random() * array.length | 0];
  },

  // [mutate]: extract from given array a random item
  pick: function (array, i) {
    return array.splice(i >= 0 ? i : Math.random() * array.length | 0, 1)[0];
  },

  // [mutate]: shuffle the given array
  shuffle: function (array) {
    for (var i = array.length; i > 0; --i)
      array.push(array.splice(Math.random() * i | 0, 1)[0]);
    return array;
  }
}

【讨论】:

【解决方案6】:
var items = Array(523,3452,334,31,...5346);

function rand(min, max) {
  var offset = min;
  var range = (max - min) + 1;

  var randomNumber = Math.floor( Math.random() * range) + offset;
  return randomNumber;
}


randomNumber = rand(0, items.length - 1);

randomItem = items[randomNumber];

学分:

Javascript Function: Random Number Generator

【讨论】:

  • 仅供参考,这可能是一行:Math.floor(Math.random() * (max - min + 1)) + min
【解决方案7】:
// 1. Random shuffle items
items.sort(function() {return 0.5 - Math.random()})

// 2. Get first item
var item = items[0]

更短:

var item = items.sort(function() {return 0.5 - Math.random()})[0];

【讨论】:

  • items[1]是第二项,第一项是items[0]
  • 哦,对不起。因为项目[0]
  • 这不会给你一个统一的洗牌:sroucheray.org/blog/2009/11/…
  • 下一个射手:let item = items.sort(() => 0.5 - Math.random())[0];
  • 知道thar算法的复杂性也很好:)
【解决方案8】:

如果你使用的是 node.js,你可以使用unique-random-array。它只是从数组中随机挑选一些东西。

【讨论】:

    【解决方案9】:

    使用下划线(或 loDash :)):

    var randomArray = [
       '#cc0000','#00cc00', '#0000cc'
    ];
    
    // use _.sample
    var randomElement = _.sample(randomArray);
    
    // manually use _.random
    var randomElement = randomArray[_.random(randomArray.length-1)];
    

    或者洗牌整个数组:

    // use underscore's shuffle function
    var firstRandomElement = _.shuffle(randomArray)[0];
    

    【讨论】:

    • 仅对一个函数使用下划线或 lodash 有点过头了,但如果您正在执行任何复杂的 js 功能,那么它可以节省数小时甚至数天。
    • 现在下划线也有更好的选择_.sample([1, 2, 3, 4, 5, 6])
    • 您可能会在任何实际项目中使用 _。这不是一件坏事。
    • lodash 在 npm 上是模块化的,所以如果你愿意,你可以只安装 sample 函数:npmjs.com/package/lodash.sample
    • 我的信条是在任何项目中使用尽可能少的库。话虽如此,我最终总是使用 lodash。太方便了 不用了
    【解决方案10】:

    另一种方法是向 Array 原型添加一个方法:

     Array.prototype.random = function (length) {
           return this[Math.floor((Math.random()*length))];
     }
    
     var teams = ['patriots', 'colts', 'jets', 'texans', 'ravens', 'broncos']
     var chosen_team = teams.random(teams.length)
     alert(chosen_team)
    

    【讨论】:

    • 数组有一个内置的长度属性——为什么要把它作为参数传递?!
    • 我想我的意思是你可以传入任何你想要的长度,而不仅仅是数组的长度 - 如果你只是想随机化前两个条目,你可以在不改变方法的情况下将长度设置为 2 .我不认为将长度属性作为参数传递存在性能问题,但我可能错了
    • 像这样扩展宿主对象通常不是一个好主意。您可能会因行为与您的行为不同的客户端对Array.random 的未来实现而绊倒,从而破坏未来的代码。您至少可以在添加之前检查以确保它不存在。
    【解决方案11】:

    jQuery 是 JavaScript!它只是一个 JavaScript 框架。因此,要查找随机项,只需使用普通的旧 JavaScript,例如,

    var randomItem = items[Math.floor(Math.random()*items.length)]
    

    【讨论】:

      【解决方案12】:
      var random = items[Math.floor(Math.random()*items.length)]
      

      【讨论】:

        【解决方案13】:
        var rndval=items[Math.floor(Math.random()*items.length)];
        

        【讨论】:

          猜你喜欢
          • 2020-05-13
          • 2014-07-30
          • 1970-01-01
          • 2017-02-01
          • 2018-10-22
          • 1970-01-01
          相关资源
          最近更新 更多