选择 5 个随机元素

IT技术 javascript jquery
2021-01-25 01:04:34

如何选择前 5 个随机元素

<ul>
    <li>First</li>
    <li>Second</li>
    <li>Third</li>
     ...
    <li>N</li>
</ul>

我正在使用这个插件

alert($("li:random").text());

但它需要所有随机元素。我只想要前5个。

有没有另一种方法可以做同样的事情?

6个回答

这是从 jQuery 选择中获取 5 个随机元素的方法,无需插件!

randomElements = jQuery("li").get().sort(function(){ 
  return Math.round(Math.random())-0.5
}).slice(0,5)

此时你有 5 个 DomElements,它们是从 jQuery 返回的所有 LI 中随机选择的

然后你可以对它们做任何你喜欢的事情,
例如改变它们的颜色:

$(randomElements).css("color","red")

或显示它们的组合文本内容:

$(randomElements).text()
这不会让你得到一个随机排序的数组。这是一篇关于它的文章(它是Objective-C,但应该无关紧要)cocoawithlove.com/2010/06/...
2021-03-16 01:04:34
这不好。选择 X 个随机元素是O(1),而对整个集合进行排序O(n log n)最多需要
2021-03-23 01:04:34
一般的想法是好的,但你不应该像那样对数组进行洗牌。排序是一种低效的数组混洗方式,不一致的比较会导致问题(甚至可能导致排序无限循环)。最好使用 Fisher-Yates shuffle ( en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle )。
2021-03-26 01:04:34
正如 Georg 指出的那样,这不会产生随机集合,因为在(快速)排序数组时将使用至少一个枢轴元素(最有可能是中间的那个)。乔治的链接很好读!投反对票。
2021-04-04 01:04:34
+1,尽管我很好奇您为什么在文本中始终正确拼写“random”,而在代码片段中始终不正确拼写... :-)
2021-04-14 01:04:34

为此,我使用Fisher-Yates shuffle创建了一个小脚本。这是通过首先创建一个随机混洗和切片的 jQuery 元素数组的副本,然后过滤掉两个数组中不存在的所有元素来完成的。

您可以在http://www.afekenholm.se/jquery-rand阅读它这是脚本:

/**
 * jQuery.rand v1.0
 * 
 * Randomly filters any number of elements from a jQuery set.
 * 
 * MIT License: @link http://www.afekenholm.se/license.txt
 * 
 * @author: Alexander Wallin (http://www.afekenholm.se)
 * @version: 1.0
 * @url: http://www.afekenholm.se/jquery-rand
 */
(function($){
    $.fn.rand = function(k){
        var b = this,
            n = b.size(),
            k = k ? parseInt(k) : 1;

        // Special cases
        if (k > n) return b.pushStack(b);
        else if (k == 1) return b.filter(":eq(" + Math.floor(Math.random()*n) + ")");

        // Create a randomized copy of the set of elements,
        // using Fisher-Yates sorting
        r = b.get();
        for (var i = 0; i < n - 1; i++) {
            var swap = Math.floor(Math.random() * (n - i)) + i;
            r[swap] = r.splice(i, 1, r[swap])[0];
        }
        r = r.slice(0, k);

        // Finally, filter jQuery stack
        return b.filter(function(i){
            return $.inArray(b.get(i), r) > -1;
        });
    };
})(jQuery);

获取一个随机数索引,1-5,并获取具有该索引的 ul 的孩子。像这样:

var index = Math.floor(Math.random() * 5) + 1;  // nth-child indices start at 1
alert($("ul:nth-child(" + index + ")").text());
哦,这是完全错误的。我读这个问题是从前五个中请求一个随机元素,而不是集合中的五个随机元素。我想我需要睡觉了!:D
2021-03-16 01:04:34
通过精确搜索这种解决方案来到这里。所以回答误读的问题并不总是坏的:)
2021-03-31 01:04:34
Math.random() 返回 [0,1) 中的值——即,包括 0 但不包括 1。所以有可能(尽管很少见)index0为避免这种情况,请使用var index = Math.floor(Math.random() * 5) + 1;.
2021-04-14 01:04:34
  jQuery.jQueryRandom = 0;
  jQuery.extend(jQuery.expr[":"], {
    random: function(a, i, m, r) {
      if (i == 0) {
        jQuery.jQueryRandom = Math.floor(Math.random() * r.length);
      };
      return i == jQuery.jQueryRandom;
    }
  });
$("li:lt(5):random").text()
但它总是需要前 5 (
2021-03-21 01:04:34