Javascript 从另一个数组的所有元素构造一个给定大小的随机数组,其出现的条件为上下界

Javascript 从另一个数组的所有元素构造一个给定大小的随机数组,其出现的条件为上下界,javascript,arrays,algorithm,Javascript,Arrays,Algorithm,我定义了一个名为box的数组,如下所示: var box = [a,b,c,d,e,f,g,h,i,j]; 我正在生成0到数组长度之间的随机数。在这种情况下,数组的长度为10: var random_number = Math.floor(Math.random() * box.length); 我通过将随机数作为数组索引传递,从框数组中检索值: var random_element = box[random_number]; 我需要使用box中的元素创建一个名为room的新数组,以便:

我定义了一个名为
box
的数组,如下所示:

var box = [a,b,c,d,e,f,g,h,i,j];
我正在生成0到数组长度之间的随机数。在这种情况下,数组的长度为10:

var random_number = Math.floor(Math.random() * box.length);
我通过将随机数作为数组索引传递,从
数组中检索值:

var random_element = box[random_number];
我需要使用
box
中的元素创建一个名为
room
的新数组,以便:

  • 房间的大小为40
  • 来自
    的每个元素都存在于
    房间
  • 框中的每个元素必须在“房间”中出现至少3次
  • 框中的每个元素必须在“房间”中出现最多5次
  • 主意 可能的方法是先按每个元素的最小数量填充数组,然后随机添加元素,直到数组被填充为止。当然,我们也应该注意最大界限

    代码
    最低金额=3
    最大金额=5
    //我们还需要跟踪每个元素的数量
    //每个元素的最小填充量
    对于(i=0;i
    洗牌
    现在你的数组看起来像
    [a,a,a,b,b,…,j,j,a,e,b,…]
    。如果您需要更随意放置的项目,请考虑使用. 我认为@Destiners的想法非常适合这份工作。我只想分享一下我对这个想法的实施情况。我使用
    room
    数组来保存字符和查找表。例如
    room.a
    将给出
    room
    数组中“a”字符的计数。然后应用一个通用的适当的洗牌

    Array.prototype.shuffle=function(){
    var i=此长度,
    J
    而(i>1){
    j=~(Math.random()*i--);
    [this[i],this[j]=[this[j],this[i]];
    }
    归还这个;
    };
    变量框=[“a”、“b”、“c”、“d”、“e”、“f”、“g”、“h”、“i”、“j”];
    房间=box.reduce((p,c)=>(p[c]=3,p.push(…c.repeat(3).split(“”),p),[]);
    同时(房间长度<40){
    var c=box[~(Math.random()*box.length)];
    房间[c]<5&(房间推(c),房间[c]+);
    }
    房间。洗牌();
    控制台、日志(房间);
    
    控制台日志(a室)此问题与问题标签中提到的每种编程语言有什么关系?此数组\计数\值适用于您$a=数组(“a”、“猫”、“狗”、“a”、“狗”);打印(数组计数值($a));?>结果将是数组([A]=>2[Cat]=>1[Dog]=>2)@kirangadvi谢谢。请参阅我创建新数组的条件。例如,
    框中的元素是否唯一,或者
    a
    是否可能等于
    b
    MINIMUM_AMOUNT = 3
    MAXIMUM_AMOUNT = 5
    // We also need to track how much of each element we have
    // Fill minimum amount of each element
    for (i = 0; i < box.length; i++) {
        for (j = 0; j < MINIMUM_AMOUNT; j++) {
            room.push(box[i])
        }
        // At first the are only 3 elements
        count[i] = MINIMUM_AMOUNT
    }
    // Fill the rest of the array
    while (room.length != 40) {
        random_index = Math.trunc(10 * Math.random())
        random_elem = box[random_index]
        // If this element did not yet reach its limit
        if (count[random_index] < MAXIMUM_AMOUNT) {
            room.push(random_elem)
            count[random_index]++
        }
    }