从JavaScript数组中获取随机物品

Jam*_*mes 843 javascript arrays random

var items = Array(523,3452,334,31,...5346);
Run Code Online (Sandbox Code Playgroud)

我如何从中获取随机物品items

Kel*_*lly 1801

var item = items[Math.floor(Math.random()*items.length)];
Run Code Online (Sandbox Code Playgroud)

  • **的Math.random()将永远是1,也不应该.**最大的指数应始终小于长度的人,不然你会得到一个`undefined`错误. (124认同)
  • 优雅的解决方 我测试了它:`var items = ["a","e","i","o","u"]``var objResults = {}``for(var i = 0; i <1000000; i ++ ){``var randomElement = items [Math.floor(Math.random()*items.length)]``if(objResults [randomElement]){``objResults [randomElement] ++``} else {``objResults [randomElement] = 1``}``}``console.log(objResults)`结果在1000000次迭代后非常随机化:`Object {u:200222,o:199543,a:199936,e:200183,i: 200116}` (16认同)
  • @virus`Math.round`不是`Math.floor`的有效替代.使用`round`会导致意外地引用一个未定义的索引,例如`Math.random()`是0.95而`items.length`是5.`Math.round(0.95*5)`是5,这将是索引无效.`floor(random)`在你的例子中总是为零. (12认同)
  • @AnkitPatial:这是一种"争夺"数组的方法,但问题是从数组中获取一个随机选择的元素.有很大的不同. (3认同)
  • 很好的答案.你可以缩短:`items [items.length*Math.random()| 0]`:) (3认同)
  • 数组为空时会发生什么? (2认同)
  • @aloisdg 没错,只要数组长度小于 2^31,这仍然是一个非常大的数字:) (2认同)

chi*_*him 97

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

var randomArray = [
   '#cc0000','#00cc00', '#0000cc'
];

// use _.sample
var randomElement = _.sample(randomArray);

// manually use _.random
var randomElement = randomArray[_.random(randomArray.length-1)];
Run Code Online (Sandbox Code Playgroud)

或者改组整个数组:

// use underscore's shuffle function
var firstRandomElement = _.shuffle(randomArray)[0];
Run Code Online (Sandbox Code Playgroud)

  • 如今下划线也有更好的选择```_.sample([1,2,3,4,5,6])``` (21认同)
  • 对一个函数使用下划线或lodash会有点过分,但如果你正在做任何复杂的js功能,那么它可以节省数小时甚至数天. (18认同)
  • 您可能会在任何实际项目中使用_.这不是一件坏事. (5认同)
  • lodash在npm上模块化,所以你可以根据需要安装`sample`函数:https://www.npmjs.com/package/lodash.sample (4认同)
  • 我的信条是尽可能少地使用任何项目的库.话虽如此,我总是最终使用lodash.不使用太方便了 (4认同)
  • `npm i -S lodash.sample`-喜欢模块化的lodash,带有浏览器! (2认同)
  • 我的表情符号、列表和括号解释器都给出了不同的结果:`:)):`,所以我不太理解第一行。 (2认同)

Aln*_*tak 95

如果你真的必须使用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);
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • 公平骰子滚动+1![对于那些不开玩笑的可怜人来说.](http://xkcd.com/221/) (79认同)
  • 当然.每行平均有少于3个链接方法,并且`$`每行至少不使用一次,因此它没有足够的jQuery. (3认同)
  • @neoascetic这行代码的重点是从数组中选择元素不是jQuery问题,而是通用的JS。 (2认同)
  • 这不是需要 jQuery 的问题。 (2认同)

Din*_*eic 43

1.解决方案:定义Array原型

Array.prototype.random = function () {
  return this[Math.floor((Math.random()*this.length))];
}
Run Code Online (Sandbox Code Playgroud)

这将适用于内联数组

[2,3,5].random()
Run Code Online (Sandbox Code Playgroud)

当然还有预定义的数组

list = [2,3,5]
list.random()
Run Code Online (Sandbox Code Playgroud)

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

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

get_random([2,3,5])
Run Code Online (Sandbox Code Playgroud)

  • @EvanCarroll更好地引用了一个有用的链接,而不是为主观概念进行downvoting,例如编码风格,这些风格不会使答案无效,也不会"无用"!/sf/ask/982392631/ (25认同)
  • Upvoted是因为向Array.prototype添加内容的downvoting对没有解释的任何人都没有用. (18认同)
  • 用于向Array.prototype添加内容的下载. (14认同)
  • 向 Array.prototype 添加新函数的问题与添加全局变量的问题相同 - 某人/其他东西可能会使用相同的“名称”来表示不同的东西 - 这可能会导致微妙的混乱 (3认同)
  • @Schmoo 我刚刚遇到了一种“微妙的混乱”情况。我将原型的名称缩短为“rand”。然后突然在“for (let i in arr)”循环中,它迭代所有预期的索引,并且还迭代“rand”的索引。必须切换到“for (let i=0,l=arr.length;i&lt;l;i++)”循环来修复它。 (2认同)

Roc*_*mat 39

var random = items[Math.floor(Math.random()*items.length)]
Run Code Online (Sandbox Code Playgroud)


K-G*_*Gun 36

这是另一种方式:

function rand(items) {
    return items[~~(items.length * Math.random())];
}
Run Code Online (Sandbox Code Playgroud)

  • 什么是疯狂的`~~`?以前在JS中从未见过. (28认同)
  • 很好的答案.你仍然可以更短:`items [items.length*Math.random()| 0]`:) (11认同)
  • @hatboysam:[搜索](http://stackoverflow.com/questions/4055633/what-does-double-tilde-do-in-javascript) - 它实质上将操作数转换为最接近的整数. (8认同)
  • 实际上,它将它向下舍入,就像`Math.floor`. (7认同)
  • “实际上,它像Math.floor一样将其四舍五入” @ programmer5000。它实际上取整为0,即~~(-1.5)计算为-1,而不是Math.floor给出的-2。 (7认同)

pla*_*nes 14

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

var randomItem = items[Math.floor(Math.random()*items.length)]
Run Code Online (Sandbox Code Playgroud)


Bli*_*ndy 11

var rndval=items[Math.floor(Math.random()*items.length)];
Run Code Online (Sandbox Code Playgroud)


nee*_*ebz 8

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];
Run Code Online (Sandbox Code Playgroud)

信用:

Javascript函数:随机数生成器

  • 仅供参考,这可能是一行:`Math.floor(Math.random() * (max - min + 1)) + min` (2认同)

Iva*_*van 7

// 1. Random shuffle items
items.sort(function() {return 0.5 - Math.random()})

// 2. Get first item
var item = items[0]
Run Code Online (Sandbox Code Playgroud)

短:

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

  • 这不会给你一个统一的洗牌:http://sroucheray.org/blog/2009/11/array-sort-should-not-be-used-to-shuffle-an-array/ (4认同)
  • `items [1]`是第二项,第一项是`items [0]`. (3认同)
  • 下一个射手:`let item = items.sort(() =&gt; 0.5 - Math.random())[0];` (2认同)

小智 5

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