防止数组项被选中两次

时间:2015-02-24 07:56:52

标签: javascript

如何防止在for循环中从数组中选择两次数字?在这种情况下,我想确保 pictureNo 每次都是唯一的。

$(document).ready(function () {
        // Generate timeline items
        var timelineItemCount = Math.floor(Math.random() * 9) + 1;
        for(i=0;i<timelineItemCount;i++)
        {
            generateTimeline();
        }
    });

function generateTimeline() {
    // Select gender
    var genderArray = ['male','female'];
    var gender = genderArray[Math.floor(Math.random()*genderArray.length)]; 

    // Select profile picture - how do I prevent the same number from being selected once here
    var pictureNo = Math.floor(Math.random() * 19) + 1;

    // Create timeline entry    
    $('#home-page').append($('<div class="timeline-item"><img src="assets/img/' + gender + '_profile' + pictureNo + '.jpg" alt="" class="img-rounded profile"></div>'));    
}

4 个答案:

答案 0 :(得分:1)

尝试并存储随机选择的数字,以便每次随机选择新数字时,您都有条件,以便将其与之前选择的数字进行比较。如果先前已选择该号码,则应选择一个新的随机数。

答案 1 :(得分:1)

在for循环外创建一个数组并存储生成的随机数。 在for循环的每次迭代中,检查新的随机数是否属于该数组。 当for循环结束时,将数组重置为空数组。

答案 2 :(得分:1)

让我们定义两个男性和女性指数数组,性别数组,洗牌和弹出一些项目。使用Underscore.JS很容易,例如:

var malesCount = 20;
var femalesCount = 20;

var profiles = {
  'male' : _.shuffle(_.range(1, malesCount + 1)),
  'female' : _.shuffle(_.range(1, femalesCount + 1)),
};

var genders = [];
for (var index = 0; index < malesCount; index++) {
  genders.push('male');
}
for (var index = 0; index < femalesCount; index++) {
  genders.push('female');
}
genders = _.shuffle(genders);

var gender;
var pictureNo;
var src;
while (gender = genders.pop()) {
  pictureNo = profiles[gender].pop();
  src = 'assets/img/' + gender + '_profile' + pictureNo + '.jpg';
  console.log(src);
}

我已经为50K的男性和50K的女性测试了这个解决方案,它只在115毫秒内执行。

答案 3 :(得分:0)

试试这个: -

$(document).ready(function () {
        // Generate timeline items
        var timelineItemCount = Math.floor(Math.random() * 9) + 1.
            selectedPicObj={};
        for(i=0;i<timelineItemCount;i++)
        {
            generateTimeline(selectedPicObj);
        }
    });

    function generateTimeline(selectedPicObj) {
    // Select gender
    var genderArray = ['male','female'], i=0;
    var gender = genderArray[Math.floor(Math.random()*genderArray.length)]; 

    // Select profile picture - how do I prevent the same number from being selected once here
    var pictureNo = Math.floor(Math.random() * 19) + 1;
        for(;i<19;i++){
            if(!selectedPicObj[pictureNo]){
                selectedPicObj[pictureNo] = true;
                break;
            }else{
                pictureNo++;
                if(pictureNo === 19){
                    pictureNo = 0;
                }
            }
        }
    // Create timeline entry    
    $('#home-page').append($('<div class="timeline-item"><img src="assets/img/' + gender + '_profile' + pictureNo + '.jpg" alt="" class="img-rounded profile"></div>'));    
}