簡體   English   中英

如何隨機化兩種不同的JavaScript數組

[英]How to randomize this kind of two different javascript arrays

我有兩個這樣的不同數組

var images = [{
    "src": "images2/animal_1.jpg",
    "title": "Dog"},

{
    "src": "images2/animal_2.jpg",
    "title": "Cat"},

{
    "src": "images2/animal_3.jpg",
    "title": "Sheep"},

{
    "src": "images2/animal_4.jpg",
    "title": "Cow"}];

var name = ["Dog", "Cat", "Sheep", "Cow"];​

我需要分別洗牌兩個數組。 但是一個條件圖像數組的標題和名稱數組的值永遠不會帶有相同的索引。 我怎樣才能做到這一點。

您需要創建兩個函數。

getRandomValue()函數將數組作為輸入,並為您提供隨機索引和值。

function getRandomValue(myArray)
{
    var index = Math.floor(Math.random() * myArray.length);
    return [myArray[index], index];
}

現在,您聲明imagesnames數組。

var images = [{
    "src": "images2/animal_1.jpg",
    "title": "Dog"},

{
    "src": "images2/animal_2.jpg",
    "title": "Cat"},

{
    "src": "images2/animal_3.jpg",
    "title": "Sheep"},

{
    "src": "images2/animal_4.jpg",
    "title": "Cow"}];

var name = ["Dog", "Cat", "Sheep", "Cow"];​

現在我們的主要功能來到這里。 首先,通過將圖像數組傳遞給randomValue()函數來獲得隨機圖像。 名稱的處理方法相同。 返回的每個值將是值和索引的數組。

現在比較索引,如果索引不同,則將兩者作為數組返回。 否則,返回該函數以生成另一個函數。

function getImgName()
{
    var img = getRandomValue(images);
    var nam = getRandomValue(name);
    if (img[1] != nam[1])
        return getImgName();
    else
        return [img[0], nam[0]];
}

首先,使用您喜歡的算法對一個數組進行混洗,例如Fisher-Yates-Knuth混洗

現在,再次洗牌結果,但現在使用一種已知的算法來移動每個元素:

function shuffleMove(array) {
    var i = array.length;
    while (--i) {
        // Notice the difference to the normal algorithm:
        // j will be a number different from i
        var j = Math.floor(Math.random() * i);
        var temp = array[i];
        array[i] = array[j];
        array[j] = temp;
    }
    return array;
}

在您的情況下,用法為:

images.shuffle();
var names = [];
for (var i=0; i<images.length; i++)
    names[i] = images[i].title;
shuffleMove(names);

要改組數組,請使用Knuth的改組。 為了滿足該條件,您需要檢查並重新滾動每個迭代(如有必要)

for (var i = name.length-1; i > 0; i--) {  
  while(1) {
    var index = Math.floor(Math.random() * i);
    // check condition 
    if (name[index] === images[i].title)
      continue;
    // swap
    var temp = name[i];  
    name[i] = name[index];  
    name[index] = temp;  
    break;  
  }  
}

暫無
暫無

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

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