2011-01-14 52 views
1

我有一個關於JavaScript的Math.random()一個問題:的Javascript:從一組隨機排除一個元素 - (好奇心)

我已經(爲一個遊戲,我要建)隨機生成一組給定的每個數(即從0到1000),每次我必須生成一個數字時,我必須檢查該數字是否已經「生成」。

這個解決方案很容易考慮一個簡單的算法,該算法檢查隨機整數是否已經存在於生成的集合中。它循環生成數字,直到找不到它。 一個片段如下:

/* ... */ 
for(var i = 0; i<upperBound; i++){ 
    var randN = Math.floor(Math.random()*upperBound); 
    while(myRandomNumbers.contains(randN)){ 
     loops++; 
     randN = Math.floor(Math.random()*upperBound); 
    } 
    myRandomNumbers.push(randN); 
} 
/* ... */ 

running example here

我想知道:這是實現這一目標的最佳方式是什麼?或者有什麼方法,而不是循環直到它生成一個「好」的數字,以排除隨機生成中的特定集合?

非常感謝大家!

+0

也許[這個答案] (http://stackoverflow.com/questions/3796786/random-number-generator-without-dupes-in-javascript)將有所幫助。或[這一個](http://stackoverflow.com/questions/2380019/generate-8-unique-random-numbers-between-1-and-100)。 – user113716 2011-01-14 15:16:56

+0

@patrick dw:這是我的同樣的解決方案,遞歸;) – stecb 2011-01-14 15:18:35

回答

3
  1. 生成一組數字的秩序。
  2. 隨機排序列表。

下面是使用一個例子的naive, biased sort

for (var nums=[],i=0;i<1000;++i) nums[i]=i+1; 
nums.sort(function(){ return Math.random()-0.5 }); 

然後,你可以pop()號斷nums獲得下一個「隨機」數,保證從未被使用過。

1

如果您的號碼的範圍並不大得驚人,你可以簡單地生成所有的數字列表,隨機化它,然後選擇它關閉一個接一個。

這是你的樣本實現的快速黑客以顯示操作此方法:http://www.jsfiddle.net/ZTLt9/8/

0

什麼布爾值1001大的陣列。

當你想覈對一下電話號碼已經產生,所有你需要做的是檢查的數量在數組中的位置:

if (!arr[randomnumber]){ 
    arr[randomnumber] = true; 
} 

最後,你可以掃描陣列發現你需要的數字。

這會增加對數字進行排序的副作用,因爲掃描會按順序排列它們。

類似的東西來,這是我的博客文章的一個主題: http://www.jameswiseman.com/blog/2010/05/27/generate-and-sort-lottery-numbers/

1

我想創建一個數組,並隨機將它洗:

function shuffle(arr) { 
    var shuffled = arr.slice(0), i = arr.length, temp, index; 
    while (i--) { 
     index = Math.floor(i * Math.random()); 
     temp = shuffled[index]; 
     shuffled[index] = shuffled[i]; 
     shuffled[i] = temp; 
    } 
    return shuffled; 
} 

// Create the array 
var i = 1000, arr = []; 
while (i--) arr[i] = i; 

// Shuffle it 
arr = shuffle(arr); 
0

的最好辦法很可能會產生數的數組,然後使用Fisher-Yates shuffle將它洗。

這裏是維基百科的文章中給出的JavaScript的例子:(這裏假設你有一個數組「A」是包含要洗牌的項目)

var n = a.length; 
for(var i = n - 1; i > 0; i--) { 
    var j = Math.floor(Math.random() * (i + 1)); 
    var tmp = a[i]; 
    a[i] = a[j]; 
    a[j] = tmp; 
} 

相關問題