dimanche 6 septembre 2015

Getting unique random items from array

Looking for a solution to this problem I have tried to follow several procedures suggested so far on SO but neither worked.

I want to select a random number of random unique items from selected array. In order to do that, I've written the following function, which always returns duplicates instead of unique items:

function getRandomItemsCombination(min, max, totalWeight, sourceArray){
    var items = {};
    //var itemsCount = Math.floor(Math.random() * (max - min + 1)) + min;
    var itemsCount = random.integer(min, max);
    var itemWeights = []
    for(var i = 0; i < itemsCount; i++){
        itemWeights.push(Math.random())
    }
    var sizesSum = itemWeights.reduce(function(pv, cv) { return pv + cv; }, 0);
    for(var i = 0; i < itemsCount; i++){
        itemWeights[i] = Math.floor(itemWeights[i]/sizesSum*totalWeight);
    }
    //var randomItem = getRandomArrayElement(sourceArray);
    var randomItem;
    var arrIntegers = []
    while(arrIntegers.length < itemsCount){
        var randomnumber=Math.ceil(Math.random()*(sourceArray.length - 1))
        var found=false;
        for(var i=0;i<arrIntegers.length;i++){
            if(arrIntegers[i]==randomnumber){found=true;break}
        }
        if(!found)arrIntegers[arrIntegers.length]=randomnumber;
    }

    items.items = [];
    var randomItemsIndex = {};
    items.quantities = [];
    var existing = false;

    for(var i = 0; i < itemsCount; i++){
        randomItem = sourceArray[arrIntegers[i]];
        var index = randomItemsIndex[randomItem.Long_desc];
        if(index == undefined){
            index = items.items.length;
            randomItemsIndex[randomItem.Long_desc] = index;
            existing = false;
        }
        else {
            existing = true;
        }
        items.items[index] = randomItem;
        if(existing){
            items.quantities[index] += itemWeights[i];
        } else {
            items.quantities[index] = itemWeights[i];
        }
        existing = false;
    }
    return items;
}

Does anyone know why it doesn't return unique items?

Thanks!




Aucun commentaire:

Enregistrer un commentaire