3

I have two arrays
var skladby=["skladba00", "skladba01", "skladba02", "skladba03"];
var zoznam=["text00", "text01", "text02", "text03"];

I would like to randomize/shuffle this two arrays in same order but items in arrays on [0] position must stay on their positions.
i.e.
var skladby=["skladba00", "skladba02", "skladba03", "skladba01"];
var zoznam=["text00", "text02", "text03", "text01"];

thx for your answers.

1
  • Can we assume the missing quotes on the strings are a typo/paste issue? Commented May 2, 2013 at 12:32

4 Answers 4

2

To change your arrays in place, get the shuffled order first and add the new arrangements to the end of the existing arrays.

Then splice out from index 1 to where the new arrangement begins (the original length).

The elements at index 0 are not affected.

var skladby= ["skladba00", "skladba01", "skladba02", "skladba03"];
var zoznam= ["text00", "text01", "text02", "text03"];

var i=0, len= skladby.length, next, order=[];
while(i<len)order[i]= ++i; //[1,2,3...]
order.sort(function(){return Math.random()-.5});


for(i= 0; i<len; i++){
    next= order[i];
    skladby.push(skladby[next]);
    zoznam.push(zoznam[next]);
}
skladby.splice(1, len);
zoznam.splice(1, len);

/* returned values

skladba00,skladba03,skladba01,skladba02

text00,text03,text01,text02 */

Sign up to request clarification or add additional context in comments.

Comments

1

Shuffle a One array With Index and then Use that array reorder these two arrays

var skladby=["skladba00", "skladba02", "skladba03", "skladba01"];
var zoznam=["text00", "text02", "text03", "text01"];
var arrayShuff = new Array();
for (var i=0;i< skladby.length;i++){
arrayShuff.push(i);
}

fisherYates(arrayShuff);
function fisherYates ( myArray ) {
   var i = myArray.length, j, tempi, tempj;
   if ( i === 0 ) return false;
   while ( --i ) {
     j = Math.floor( Math.random() * ( i + 1 ) );
     tempi = myArray[i];
     tempj = myArray[j];
     myArray[i] = tempj;
     myArray[j] = tempi;
   }
}
var temp_skladby = new Array();
for (i=0;i < arrayShuff.length;i++){
   temp_skladby.push(skladby[arrayShuff[i]]);
}
skladby = new Array();
skladby = temp_skladby.slice(0);
temp_skladby = new Array();
for (i=0;i < arrayShuff.length;i++){
   temp_skladby.push(zoznam[arrayShuff[i]]);
}
zoznam = new Array();
zoznam = temp_skladby.slice(0);
console.log(zoznam);
console.log(skladby);

See Demo

1 Comment

That fisherYates methods are refer from sedition.com/perl/javascript-fy.html
1

Find random numbers first and then make the same swaps in both of the arrays:

        var skladby = ["skladba00", "skladba01", "skladba02", "skladba03", "skladba04", "skladba05"];
        var zoznam = ["text00", "text01", "text02", "text03", "text04", "text05"];

        if (skladby.length == zoznam.length) {
            var arr = [];
            var length = skladby.length;
            while (arr.length < length-1) {
                var randomnumber = Math.ceil(Math.random() * (length - 1));
                var found = false;
                for (var i = 0; i < arr.length; i++) {
                    if (arr[i] == randomnumber) {
                        found = true;
                        break;
                    }
                }
                if (!found)
                    arr[arr.length] = randomnumber;
            }

            var swapTemp;
            for (var i = 1; i < length; i++) {
                swapTemp = skladby[i];
                skladby[i] = skladby[arr[i - 1]];
                skladby[arr[i - 1]] = swapTemp;

                swapTemp = zoznam[i];
                zoznam[i] = zoznam[arr[i - 1]];
                zoznam[arr[i - 1]] = swapTemp;
            }
        }

Comments

0
function shuffle(o){ 
    for(var j, x, i = o.length; i; 
    j = parseInt(Math.random() * i), x = o[--i], o[i] = o[j], o[j] = x);   
    return o;
};

var skladby=["skladba00", "skladba02", "skladba03", "skladba01"];
var zoznam=["text00", "text01", "text02", "text03"];

// concat the first element with the shuffeld other elements
var skladbySorted = skladby.slice(0,1).concat(shuffle(skladby.slice(1,skladby.length)));
var zoznamSorted = zoznam.slice(0,1).concat(shuffle(skladby.slice(1,zoznam.length)));

console.log(skladbySorted);
console.log(zoznamSorted);

This would work for all sizes of your input array, not only 4 elements

credit to shuffle method goes to Jeff

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.