1

私はこのような2つの異なる配列を持っています

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"];​

両方のアレイを個別にシャッフルする必要があります。ただし、1つの条件画像配列のタイトルと名前配列の値が同じインデックスになることはありません。どうやってやるの。

4

3 に答える 3

1

2 つの関数を作成する必要があります。

このgetRandomValue()関数は配列を入力として受け取り、ランダムなインデックスと値を提供します。

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

images次に、names配列を宣言します。

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]];
}
于 2012-09-05T18:03:41.523 に答える
0

まず、 Fisher-Yates-Knuthシャッフルなど、お気に入りのアルゴリズムを使用して1つの配列をシャッフルします。

ここで、その結果をもう一度シャッフルしますが、すべての要素を移動することがわかっているアルゴリズムを使用します。

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);
于 2012-09-05T18:20:03.057 に答える
0

配列をシャッフルするには、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;  
  }  
}
于 2012-09-05T18:20:35.570 に答える