簡體   English   中英

從數組中獲取隨機項,在for循環中,然后從數組中刪除

[英]Get random item from array, within a for loop, then remove from array

我正在寫一個腳本,onload會將一個類添加到12個DIV的隨機4中,然后從數組中刪除DIV的ID。

我有一個陣列設置,其中包含所有12個DIV ID。

有時當我重新加載頁面時,4個DIV'S有該課程,有時只有3個DIV有該課程。

有點堅持為什么會發生這種情況。 我注釋掉了從數組代碼中刪除 ,看看是否是問題,但仍然是同樣的問題。

這是我的代碼:

//Randomize Which Shoes Are Positive And Negative
function randomizeShoes(){
    allGroundShoes = new Array('ground_black_1','ground_black_2','ground_brown_1','ground_brown_2','ground_clown_1','ground_clown_2','ground_disco_1','ground_disco_2','ground_moccasins_1','ground_moccasins_2','ground_red_1','ground_red_2');
    for(var i=0; i < 4; i++){
        randomAllGroundShoes = allGroundShoes[Math.floor(Math.random() * allGroundShoes.length)];
        $('#'+randomAllGroundShoes+'').addClass('shoeNegitive');
        //randomShoeID = allGroundShoes.indexOf('randomAllGroundShoes');
        //if(randomShoeID != -1){ allGroundShoes.splice(randomShoeID, 1); }
    }
}

刪除找到的元素時,傳入的是字符串文字而不是變量名:

allGroundShoes.indexOf('randomAllGroundShoes');

由於沒有元素'randomAllGroundShoes' ,因此永遠不會找到該元素,並且不會從數組中刪除任何元素。

它應該是:

allGroundShoes.indexOf(randomAllGroundShoes);

但是,你不止一次地做同樣的事情。 您根本不需要檢查allGroundShoes.indexOf() 您可以將隨機數存儲在變量中並再次引用它。 但是,即使這比你需要的還要多。 只需調用splice()來獲取您的值:

randomAllGroundShoes = allGroundShoes.splice(
    Math.floor(Math.random() * allGroundShoes.length), 1)[0];
$('#'+randomAllGroundShoes).addClass('shoeNegitive');

這樣,您可以在一個步驟中檢索您的值並將其從數組中刪除 - 無需其他查找。

jsfiddle.net/kRNTg

可能,相同的數字可能會生成兩次。

在這種情況下,如果已使用該號碼,則必須有一個檢查機制。

你可以做的是生成一個4個唯一隨機數的數組,並通過它來設置類。

var unqiue_arr = []
while(arr.length < 8){
  var randomnumber=Math.floor(Math.random()*12)
  var found=false;
  for(var i=0;i<3;i++){
    if(unqiue_arr[i]==randomnumber){found=true;break}
  }
  if(!found)unqiue_arr[unqiue_arr.length]=randomnumber;
}

我相信你刪除代碼是個問題。 嘗試將最后兩個注釋掉的行更改為:

randomShoeID = allGroundShoes.indexOf(randomAllGroundShoes);
if(randomShoeID != -1){ allGroundShoes = allGroundShoes.splice(randomShoeID, 1); }

帶有注釋掉行的代碼存在的問題是,當項目未被刪除時,隨機選擇可能會選擇兩次或更多次。

您注釋掉的行有同樣的問題。 你確實搜索了allGroundShoes.indexOf('randomAllGroundShoes'); 其中(是一個字符串而不是變量)從未包含在數組中。

請改用此代碼:

function randomizeShoes(){
    allGroundShoes = ['ground_black_1','ground_black_2','ground_brown_1','ground_brown_2','ground_clown_1','ground_clown_2','ground_disco_1','ground_disco_2','ground_moccasins_1','ground_moccasins_2','ground_red_1','ground_red_2'];
    for (var i=0; i<4; i++){
        var randomShoeID = Math.floor(Math.random() * allGroundShoes.length);
        var randomAllGroundShoes = allGroundShoes[randomShoeID];
        $('#'+randomAllGroundShoes+'').addClass('shoeNegitive');
        allGroundShoes.splice(randomShoeID, 1);
    }
}

不需要搜索您已經知道的項目的索引,並且不需要檢查-1因為您知道該項目包含在您剛剛將其拉出的數組中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM