Javascript 在列表中使用随机生成的nr至少两次

Javascript 在列表中使用随机生成的nr至少两次,javascript,jquery,random,html-lists,Javascript,Jquery,Random,Html Lists,我有以下几把小提琴: 它包含一个javascript生成的列表。每个都有一个随机选择的类。此随机选择通过以下方式完成: var randomClass; randomClass = Math.round(Math.random() * 10 + 0); 这将生成一个随机nr。我使用该nr来获得此处定义的随机类: var classes = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k']; 因此,如果随机nr是a2,则类将是b 这

我有以下几把小提琴:

它包含一个javascript生成的列表。每个
都有一个随机选择的类。此随机选择通过以下方式完成:

var randomClass;
randomClass = Math.round(Math.random() * 10 + 0);
这将生成一个随机nr。我使用该nr来获得此处定义的随机类:

var classes = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k'];
因此,如果随机nr是a
2
,则类将是
b

这是一个完美的例子。我的问题是,我希望每个类(或随机nr)在到达完整列表的末尾之前至少使用两次。(小提琴有一个很短的列表,真正的列表更长,还包含多个

示例:因此,如果随机选择的nr为
5
,它将给出class
e
。这意味着必须再次使用此nr/类别,但也必须随机放置在所有不同的列表上。如果列表中的随机nr恰好是
5
,则可以多次使用nr/类

整个列表中使用的
总量始终为偶数

另一个例子: 因此,超过6个
的类可以是:
a、d、a、e、e、d
。所有的班级都有两次,而且都是随机的

这是错误的:
a、d、b、b、e、c
。这是当前的情况,这些类不会被使用两次

希望我把问题解释得足够清楚。我的英语不是最好的:)


亲切问候,

编辑-取代了以前的解决方案,因为它没有在所有
ul
标签上重复

我已经更新了您的代码,现在它总是在所有
标记中至少添加两次每个类

我确实需要事先知道物品的总数。目前,我已将该计数添加为常量
totalCount
,因为我不想为了获得总计数而对JSON对象进行两次迭代,我想先让主代码工作

也许总数可以作为JSON对象的一部分作为对象根中的一个单独属性发送下来

无论哪种方式,物品总数都必须事先知道

我将一些必需的变量移到了一个更全局的范围,因为每个
ul
都会调用render方法

var classes = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k'];
//var classes = ['a', 'd', 'f'];
var sourceClasses = [];
var totalCount = 6;
var selectedClasses = [];

Menu.prototype.render = function() {    
    // Get total item count between all arrays
    //debugger;    
    var ul = $("<ul />");

    $.each(this.data, function(i, e) {
        var li = $("<li />");

        //console.log(listItemCount);
        //debugger;
        $.each(e, function(j, f) {
            //debugger;
            // If we have no more classes left we re-set the list of items to the original source
            // SourceClasses.length will off course not be 0 ever if we already passed the half-way mark.
            if(sourceClasses.length === 0){
                for(index = 0; index < classes.length; index++){
                    sourceClasses.push(classes[index]);
                }
            }            

            var randomClass;
            randomClass = Math.round(Math.random() * (sourceClasses.length - 1) + 0);

            var selectedClass = sourceClasses[randomClass];

            li.append($("<a></a>", {
                href: f.url,
                text: f.title,
                class: selectedClass
            }));

            sourceClasses.splice(sourceClasses.indexOf(selectedClass), 1);
            selectedClasses.push(selectedClass);

            // Check for half-way mark.
            var itemCount = selectedClasses.length;

            if (totalCount % 2 != 0) {
                if (itemCount === (totalCount - 1) / 2) {
                    sourceClasses = selectedClasses;
                    var additionalClass = Math.round(Math.random() * (sourceClasses.length - 1) + 0);
                    sourceClasses.push(sourceClasses[additionalClass]);
                    selectedClasses = [];
                };
            } else {
                if (itemCount === totalCount / 2) {
                    sourceClasses = selectedClasses;
                    selectedClasses = [];
                };
            }
        });
        ul.append(li);
    });

    //console.log($($(ul).find("a")));
    return ul;
};
假设是: //现在将声明移动到外部范围并稳步增加计数。 itemCount+=1

现在,代码正在按照我的计划执行所有操作

-使用70个链接和11个类池 所有链接都得到get类,所有类至少使用了两次,因为我们只有11个。 任何链接都不应该没有类,因为总有一个源可供选择

关于你关于确保每节课至少使用一节课的问题。这取决于可用类与总项的中间标记的比率

如果您使用11个类作为可能的源和至少22个预期链接,那么您的所有类都将被使用将被使用两次

如果您正在使用20个类和22个项目,则不会使用所有类。这样做的原因是因为您最初要求每个选定的类至少使用两次

为了确保所有选定的类至少使用两次,我将在名为
selectedClasses
的单独数组中记录每个选择。我们已经处理了一半的可能项,我用selected classes数组替换源类。现在,项目的另一半只能从已经选择的类列表中进行选择,从而确保每个类至少使用两次

试想一下,如果您有一个包含20个类和总共22个项的数组,那么您不能使用所有类,如果您同时希望确保所选的每个类至少使用两次,则至少不能使用一个类。这些要求相互矛盾

可用类的数量必须小于或等于项目总数的一半,以确保所有类至少使用一个所有选定类至少使用两次


我希望这是有意义的,但如果您被卡住了,请随时在评论区内开始聊天,我可以再次与您讨论代码,没有问题。

编辑-替换了以前的解决方案,因为它不会在所有
ul
标签上重复

我已经更新了您的代码,现在它总是在所有
标记中至少添加两次每个类

我确实需要事先知道物品的总数。目前,我已将该计数添加为常量
totalCount
,因为我不想为了获得总计数而对JSON对象进行两次迭代,我想先让主代码工作

也许总数可以作为JSON对象的一部分作为对象根中的一个单独属性发送下来

无论哪种方式,物品总数都必须事先知道

我将一些必需的变量移到了一个更全局的范围,因为每个
ul
都会调用render方法

var classes = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k'];
//var classes = ['a', 'd', 'f'];
var sourceClasses = [];
var totalCount = 6;
var selectedClasses = [];

Menu.prototype.render = function() {    
    // Get total item count between all arrays
    //debugger;    
    var ul = $("<ul />");

    $.each(this.data, function(i, e) {
        var li = $("<li />");

        //console.log(listItemCount);
        //debugger;
        $.each(e, function(j, f) {
            //debugger;
            // If we have no more classes left we re-set the list of items to the original source
            // SourceClasses.length will off course not be 0 ever if we already passed the half-way mark.
            if(sourceClasses.length === 0){
                for(index = 0; index < classes.length; index++){
                    sourceClasses.push(classes[index]);
                }
            }            

            var randomClass;
            randomClass = Math.round(Math.random() * (sourceClasses.length - 1) + 0);

            var selectedClass = sourceClasses[randomClass];

            li.append($("<a></a>", {
                href: f.url,
                text: f.title,
                class: selectedClass
            }));

            sourceClasses.splice(sourceClasses.indexOf(selectedClass), 1);
            selectedClasses.push(selectedClass);

            // Check for half-way mark.
            var itemCount = selectedClasses.length;

            if (totalCount % 2 != 0) {
                if (itemCount === (totalCount - 1) / 2) {
                    sourceClasses = selectedClasses;
                    var additionalClass = Math.round(Math.random() * (sourceClasses.length - 1) + 0);
                    sourceClasses.push(sourceClasses[additionalClass]);
                    selectedClasses = [];
                };
            } else {
                if (itemCount === totalCount / 2) {
                    sourceClasses = selectedClasses;
                    selectedClasses = [];
                };
            }
        });
        ul.append(li);
    });

    //console.log($($(ul).find("a")));
    return ul;
};
假设是: //现在将声明移动到外部范围并稳步增加计数。 itemCount+=1

现在,代码正在按照我的计划执行所有操作

-使用70个链接和11个类池 所有链接都得到get类,所有类至少使用了两次,因为我们只有11个。 任何链接都不应该没有类,因为总有一个源可供选择

关于你关于确保每节课至少使用一节课的问题。这取决于可用类与总项的中间标记的比率

如果您使用11个类作为可能的源和至少22个预期链接,那么您的所有类都将被使用将被使用两次

如果您正在使用20个类和22个项目,则不会使用所有类。原因