2016-03-06 27 views
-3

說我從1到12之間挑選10個隨機數字並將它們放入數組中。我如何循環以消除重複?挑選15個隨機數字讓他們洗牌不會得到重複

我花了很多時間在這個上,不能得到它的工作。

+0

的範圍是Java或JavaScript?兩者完全不同 –

+1

@Xoce您怎麼看?它在for循環中有'var i = 0'。 –

+0

請問這是爲什麼java標記的比??? [此](http://stackoverflow.com/questions/9229645/remove-duplicates-from-javascript-array)幫助 –

回答

0

有兩個aproaches這個問題:

創建一個隨機數,請檢查是否它已經被摘下來,如果沒有,這個值添加到輸出。

var numbers = []; 
while(numbers.length < 10){ 
    var nr = Math.floor(Math.random() * 12)+1 
    if(numbers.indexOf(nr) === -1) numbers.push(nr); 
    else console.log("threw away ", nr); 
} 

這工作不錯,如果您想選擇號碼少量出一個大範圍, ,因爲這裏很可能打幾碰撞(一遍又一遍挑選相同的隨機數了一遍,必須扔掉它)。

在你的情況下10個值了一系列12的,這是很可能的,你將有其中的代碼必須一遍又一遍地創建隨機數結束時很多次 的一遍又一遍,以找到另一個 號這還不是你的設置。

所以我們得到第二個問題:創建一個包含所有可能值的集合,將其拖動, 然後從中分出一部分。

//a helper to shuffle the array 
function shuffle(arr){ 
    for(var i=arr.length; --i > 0;){ 
     var j = Math.floor(Math.random() * i); 
     var tmp = arr[j]; 
     arr[j] = arr[i]; 
     arr[i] = tmp; 
    } 
    return arr; 
} 

//a helper to create a sequence ov values 
function range(from, to, step){ 
    step = Math.abs(+step) || 1; 
    to = +to || 0; 
    var i = +from || 0, out = []; 
    if(i > to) while(i>to) out.push(i), i -= step; 
    else while(i<to) out.push(i), i += step; 
    return out; 
} 

var numbers = shuffle(range(1,13)).slice(0, 10); 

這將創造一個辦法大的開銷,如果你只需要一小套了一個巨大的價值

1

如果你想要1到20之間的15個隨機整數而不重複,那就是你範圍內的大部分整數。我只想生成的數字1-20和刪除一個隨機的15倍:

function randomIntegersInRange(min:int, max:int, count:uint):Array { 
    if (min >= max || count > max - min) throw new ArgumentError("Invalid arguments!"); 
    var integers:Array = []; 
    for (var i:int = min; i <= max; i++) { 
     integers.push(i); 
    } 

    var randomIntegers:Array = []; 
    for (i = 0; i < count; i++) { 
     randomIntegers.push(integers.splice(Math.random() * integers.length, 1)); 
    } 
    return randomIntegers; 
} 

randomIntegersInRange(1, 20, 15); // 16,4,3,13,8,17,1,19,20,15,6,18,14,10,12 
randomIntegersInRange(1, 50, 20); // 27,3,19,9,42,23,13,29,11,24,41,31,26,2,7,30,49,33,6,10 

注:我不建議這一點,如果你想大規模範圍,如1至1,000,000 15點的整數。

+0

但是,如果我想要隨機數字?比如說從1-50開始,然後選擇20而沒有得到任何重複? – zzz

+0

這給你隨機數字。如果你想參數化範圍,只需將上面的'20'和'15'變成變量。 – Aaron

+0

@CollapsedSounds將我的答案編輯爲一個帶有參數範圍和數量的函數。 – Aaron

0

做一個遞歸方法,

function pushIt(arr){ 
var idx:int; 
if(arr.length == 10){ return arr; } 
else { 
    idx = Math.floor(Math.random() * 12) + 1; 
    if(arr.indexOf(idx) == -1){ arr.push(idx); } 
    return pushIt(arr); 
} 
} 

console.log(pushIt([])); 
0

[5,1,8,4,如圖10所示,9,11,2,6,7]

function generateUniqueArray(length, rangeMax){ 
 
    var arr = []; 
 
    while(arr.length < length) { 
 
    var rand = Math.ceil(Math.random()*rangeMax); 
 
    var isInArr = false; 
 
    for(var i = 0; i<arr.length;i++){ 
 
     if(arr[i]===rand){ 
 
     isInArr = true; 
 
     break; 
 
     } 
 
    } 
 
    if (!isInArr){ 
 
     arr[arr.length]=rand; 
 
    } 
 
    } 
 
    return arr; 
 
} 
 

 
console.log(generateUniqueArray(10,12));

+0

'generateUniqueArray(12,10)'* crash *;) – Aaron

0

你可以把它們放到哈希(js對象)中,然後返回哈希中的鍵:

function getUniques(arr){ 
    var seen = {}; 
    arr.forEach(function(item){ 
    seen[item] = true; 
    }); 
    return Object.keys(seen); 
}