Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/448.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 值数目变化的数组分布_Javascript_Arrays_Loops_Distribution - Fatal编程技术网

Javascript 值数目变化的数组分布

Javascript 值数目变化的数组分布,javascript,arrays,loops,distribution,Javascript,Arrays,Loops,Distribution,我有一系列需要提供产品的用户,例如: 值的数量总是在变化-第一次执行分配时可能只有一个值,第二次为三个 必须对这些值进行洗牌和分配,同时确保个人不会两次获得相同的值 到目前为止,我所做的是对阵列进行洗牌,并为每个用户提供十种产品: var users = ["user1", "user2", "user3"]; var products = ["p1", "p2", "p3", "p4", "p5", "p6", "p7", "p8", "p9", "p10","p11", "p12", "p

我有一系列需要提供产品的用户,例如:

值的数量总是在变化-第一次执行分配时可能只有一个值,第二次为三个

必须对这些值进行洗牌和分配,同时确保个人不会两次获得相同的值

到目前为止,我所做的是对阵列进行洗牌,并为每个用户提供十种产品:

var users = ["user1", "user2", "user3"];

var products = ["p1", "p2", "p3", "p4", "p5", "p6", "p7", "p8", "p9", "p10","p11", "p12", "p13", "p14", "p15", "p16", "p17", "p18", "p19", "p20", "p21", "p22", "p23", "p24", "p25", "p26", "p27", "p28", "p29", "p30"];

function shuffle(array) {
var currentIndex = array.length, temporaryValue, randomIndex;

while (0 != currentIndex) {

  randomIndex = Math.floor(Math.random() * currentIndex);
  currentIndex -= 1;

  temporaryValue = array[currentIndex];
  array[currentIndex] = array[randomIndex];
  array[randomIndex] = temporaryValue;
}

return array;
}

i = 0;
while (i < users.length) { 
    newArray = (shuffle(products)).slice(0, 10)
    console.log(users[i++] + ' products: ' + newArray);
}

这个问题的困难在于,您希望分发的产品比现有的产品多一些,这样一些产品就可以归属于多个用户。然而,您还希望平均分配产品,并确保没有人获得重复的产品

为了有效地做到这一点,即在用户和产品的线性时间内,将需要更多的代码

以下算法将坚持这一点:

  • 所有产品将至少分发一次
  • 其中约20%(向上舍入)将进行第二次分发
  • 没有用户会两次获得相同的产品
  • 所有用户将收到几乎相同数量的产品。差异最多是一种产品
  • 随机选择可能少了一个产品的用户
  • 用户收到的产品订单是随机的
函数混洗(arr){
//不更改给定数组,但返回新数组
arr=arr.slice();
var i=阵列长度;
而(i){
var j=Math.floor(Math.random()*i--);
[arr[i],arr[j]=[arr[j],arr[i]];
}
返回arr;
};
功能分配(产品、用户){
//只有一种可能结果的病例:
if(users.length==0)返回{};
if(users.length==1)返回{[users[0]]:shuffled(products)};
//我们将两次分销约20%的产品
var distributeCount=Math.ceil(products.length*1.2);
//创建要返回的对象结构:key是用户名,
//价值是产品的集合
var财产=用户。减少((acc,用户)=>
assign(acc,{[user]:new Set()}),{});
//将分配产品的用户顺序
var usersLeft=shuffled(用户);
while(usersLeft.length控制台日志(结果)关于分配值,您有什么想法?是每个人都得到了所有的值,还是你只想在人与人之间尽可能均匀地分配值而不重复?嗨,迈克,不是每个人都应该得到所有值-值需要在所有人之间分配,但是,对于某些人来说,有一些值是相同的,只是顺序不同,没有相同的值两次是可以的。你的代码有什么问题?它的产量不是你想要的吗?@trincot不是,因为不是所有的产品都是如此distributed@trincot目前我已经将其设置为分发10种产品,而如果只有一种产品可用,则必须将其提供给一个随机用户
user1 products: p5,p6,p13,p2,p19,p22,p8,p20,p27,p28
user2 products: p6,p30,p22,p9,p25,p2,p7,p17,p19,p10
user3 products: p20,p25,p23,p4,p28,p9,p12,p14,p21,p17