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

Use a random generated nr in a list at least twice

本文关键字:随机 两次 nr 列表      更新时间:2023-09-26

我有以下小提琴:http://jsfiddle.net/mauricederegt/MhhBc/

它包含一个带有javascript生成列表的。每个CCD_ 1被赋予一个随机选择的类。此随机选择使用:

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是2,则类将是b

这个al工作得很好。我遇到的问题是,我希望每个类(或随机nr)在到达完整列表的末尾之前至少使用两次。(fiddle有一个很短的列表,真正的列表更长,也包含多个<ul>)。

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

整个列表中使用的<a>的总量始终是偶数。

另一个例子:所以6个<a>的类可以是:<a>0。所有的类都在里面两次,而且都是随机的。

这是错误的:a, d, b, b, e, c。这是目前的情况,类没有使用两次

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

亲切问候,

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

我已经更新了您的代码,现在它总是在所有<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;
};

DEMO-每个类在所有列表项中至少使用两次

(使用浏览器中的调试器工具检查渲染的HTML以获取结果)

您注意到,现在内部循环中发生的第一件事是,我正在检查是否还有可用的类,如果没有,我会将可用的类重新设置到原始列表中。

只有当可用类的原始列表少于项目总数时,才会发生这种情况。

在每个列表项的迭代过程中,我仍然从可用类的列表中删除选定的类,以确保每个类至少显示两次。

我仍然在另一个数组中记录所选的类,然后在项目列表进行到一半时,我用它来重新设置可用类的数组。

如果项目总数为奇数或偶数,则该代码有效。

对于偶数的总项目,我们只需通过除以2来测量laf方式标记。
对于奇数个总项目,我确保标记中途(totalCount -1) / 2,然后在已经选择的类中添加一个随机类作为额外的可用类。

这一切现在都应该如预期的那样工作。。。。。

编辑(2021年9月3日)
我检查了代码,发现其中有一个逻辑错误。itemCount在中途标记后被重新设置。

此代码:

var itemCount = selectedClasses.length;

假设已经://将声明移到外部范围,并稳步增加计数。itemCount+=1

现在代码正在按我的计划做每件事。

DEMO-使用70个链接和11个类池

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

关于你的问题,确保每节课至少使用一节。这取决于可用类别与总项目的中间分数的比例。

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

如果您使用20个类和22个项目,则并非所有类都将被使用。原因是您最初的要求to use each selected class at least twice

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

想想看,如果你有一个由20个类和总共22个项目组成的数组,你就不能使用所有的类——如果你同时想确保每个被选中的类至少使用两次,那么至少要使用一个。这些要求相互矛盾。

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

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