2015-02-24 91 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毫秒。