2012-05-25 151 views
0

我正在使用下面的代碼生成0到Totalfriends之間的隨機數,我想要得到隨機數,但不應該重複。任何想法如何?如何生成沒有重複的隨機數字javascript

這是我在範圍使用

FB.getLoginStatus(function(response) { 
    var profilePicsDiv = document.getElementById('profile_pics'); 
FB.api({ method: 'friends.get' }, function(result) { 

    // var result =resultF.data; 
    // console.log(result); 
    var user_ids="" ; 
    var totalFriends = result.length; 
    // console.log(totalFriends); 
    var numFriends = result ? Math.min(25, result.length) : 0; 
    // console.log(numFriends); 
    if (numFriends > 0) { 
     for (var i=0; i<numFriends; i++) { 
     var randNo = Math.floor(Math.random() * (totalFriends + 1)) 
     user_ids+= (',' + result[randNo]); 
     console.log(user_ids); 

      } 
     } 
     profilePicsDiv.innerHTML = user_ids; 
     }); 
}); 
+0

你應該使用'Math.floor(Math.random()* totalFriends)',否則你有時會超過數組的末尾 – Eric

回答

1

這是一個函數,它將從array中取n個隨機元素,並根據fisher-yates shuffle返回它們。請注意,它將修改array參數。

function randomFrom(array, n) { 
    var at = 0; 
    var tmp, current, top = array.length; 

    if(top) while(--top && at++ < n) { 
     current = Math.floor(Math.random() * (top - 1)); 
     tmp = array[current]; 
     array[current] = array[top]; 
     array[top] = tmp; 
    } 

    return array.slice(-n); 
} 

假設你的代碼工作如何,我認爲是這樣,你已經有用戶ID的數組:

var random10 = randomFrom(friendIds, 10); 
+0

我已經更新完整的代碼,我實際上從ID的這些列表中獲取ID的列表,我是隨機選擇25。 – Yahoo

+0

所以我應該在頁面中添加這個'randomFrom'函數,然後將它稱爲'randNo'的位置? – Yahoo

2
  1. 創建陣列(例如yourarray)數字的代碼[1..totalfriends]
  2. 洗牌陣列(例如,使用JavaScript實現Fisher-Yates算法的)
  3. 裏面的for(從0yourarray.length - 1)從數組中取出pop()(或者只是得到n-th元素),所以您將獲得每次不同數量的

你這樣做你會避免讓重複的數字

+0

我與'pop()'函數不相似,我怎麼能在這裏實施。 ? – Yahoo

+0

pop已經在javascript中實現了。它返回數組中的最後一個元素 – fcalderan

0

我會進行隨機重複,在所有的號碼,如創建磁盤陣列:

var friendIndexes = []; 

for (var i=0; i<numFriends; i++) 
{ 
    friendIndexes.push(i); 
} 

然後,一旦你有一個所有數字的數組,我會執行一些迭代次數,也許是1,000次,在那裏你生成兩個隨機數,並交換這些索引中的值。

for (var s = 0; s<1000; s++) 
{ 
    var rnd1 = Math.floor(Math.random() * (numFriends + 1); 
    var rnd2 = Math.floor(Math.random() * (numFriends + 1); 

    // Swap the two values (remember to use a temp variable) 
    var tmp = friendIndexes[rnd1]; 
    friendIndexes[rnd1] = friendIndexes[rnd2]; 
    friendIndexes[rnd2] = tmp; 
} 

你基本上在洗牌他們,結果會給你隨機順序的數字。

+0

這個想法很好,但[Fisher-Yates shuffle](http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle)是一種更有效的方式洗牌一個數組。 –

+0

我已經更新完整的代碼,我實際上從ID的這些列表中獲取ID的列表我是隨機選擇25 – Yahoo

-2

這個問題在以前問: javascript to generate 50 no-repeat random numbers

你應該看看答案在那裏。而不是50,將限制設置爲numFriends,並且您應該有一個工作解決方案。

+1

這不是一個有效的隨機排序,正如[this](http://stackoverflow.com/a/4027990/102441)回答。 – Eric

+0

另請參閱[本](http://stackoverflow.com/q/962802/102441) – Eric

+0

感謝您的鏈接。你可以將它們添加到鏈接答案中,以便關注具有強大隨機排序的問題,而不是像提供文檔鏈接那樣簡單但有偏見的隨機排序。 – StarPilot

0

拿一個大數目至極而不是分裂numFriends或只是一個大素數(比如一個: 702038,727699,992700,1201046,1232255,2312734,3136255,4235414,6090515),然後進入

var result=[] ; 
var K=Math.floor((Math.random()*bigUnNumFreindsDivider) ; 

for (var i=0; i<numFriends; i++) 
{ 
    result[i]=(i*bigUnNumFreindsDivider+K)%numFreinds ; 
} 

這應該很好地工作。