2015-02-24 65 views
0

如何防止在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>'));  
} 
+0

尝试创建一个条件性别存在时,你不应该打印它。这是我猜的解决方案。一个简单的条件问题。 – frogcoder 2015-02-24 08:01:04

+0

创建一个抓取随机数的函数。并创建一个包含以前选择的随机数字的数组。检查新的随机数是否在数组中有一个索引,如果它有,然后重新运行随机函数,直到你将有一个唯一的随机数。 – 2015-02-24 08:09:46

回答

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>'));  
} 
+0

为什么如此低效和复杂的这样一个简单的任务? – 2015-02-24 09:10:33

+0

为什么它效率低下?而不是使用像下划线那样的库,只有很少的kbs,你可以使用小代码片段。现在,如果我们谈论效率,对于一个对象查找复杂度是O(1),然后查找下一个对象,它不会超过O(n)。并且在内部,所有库都必须检查(包括下划线) – Vaibhav 2015-02-24 09:13:30

+0

由于有两个嵌套循环,我认为有O(n^2)。不明确的generateTimeline()函数的复杂性。很难想象它是如何工作的 – 2015-02-24 09:21:49

1

尝试,每一个新的号码是随机选择的,你有一个条件将其与先前选择的号码比较时存储的随机选择号码,。如果号码先前被选择,则应该选择一个新的随机数。

1

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

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毫秒。