PDA

View Full Version : Why is this function crashing???

andricom
06-18-2012, 12:56 PM
Hi,

I'll try to explain what I was trying to do with this functions.

say you have four pairs of things, pair 1-1, 2-2, 3-3 and 4-4, and you want to swap one element of each pair and give it to another

example

1-4, 2-3, 3-1, 4,2

the only thing I want to make sure is:

1. No element can be paired with 'himself' so no '1-1 or 2-2' after the function.

and 2. No repeating assigned elements, so no '1-3, 2-3' after the function.

So this would be a way of permute numbers.

an this is how I tryed it:

value = document.myform.three.value;

var x = new Array(value);

for(a=0;a<value;a++){

x[a]= 0;
}

function itera(){

value = document.myform.three.value;

for(var a=0; a<value; a++){

x[a] = Math.floor(Math.random()*value);

for (var b=a; b>=0; b=b-1){

if (x[a] == x || x[a]==a){

do {
x[a]= Math.floor(Math.random()*value);
}

while(x[a] == a);

b=a;

}

else {

}

}

being 'Value' the number of pairs to permute, which is an external input.

This function works fine some times but [B]sometimes it crashes and I can't figure out why

I'd apreciate some help please. thanks.

PD: I don't care whether there is a specific function to permute numbers, I'd simply like to understand whats wrong with this one.

Dormilich
06-18-2012, 04:21 PM

sunfighter
06-18-2012, 09:48 PM
Maybe because it's missing two curly brackets at the end
}}

If not fixed publish the rest of the code

andricom
06-18-2012, 10:55 PM
thanks,

seems I had some bugs in another part of the code.

Lerura
06-19-2012, 01:23 AM

e.g. if the first 3 pairs becomes 1-2 , 2-4 , 4-1.
then the only possible pair left is 3-3.
as it fails to validate, the script will try over and over again, but will never succeed.

In this case a swap between a random, already set second-value and the remaining second-value is needed

<script>
value = document.myform.three.value;

Pairs=[];
for(var a=0; a<value; a++){
Pairs[a]=a+1;
}
SecondValues=Pairs.slice(0);
// --- Create all pairs but one --- //
for (x=0;x<Pairs.length-1;x++){
do {
C=Math.floor(Math.random()*SecondValues.length);
} while(Pairs[x]==SecondValues[C] );

Pairs[x]=[Pairs[x],SecondValues.splice(C,1)[0]];
}
// --- Test, and swap values if last pairs can't be valid. --- //
S=Math.floor(Math.random()*(Pairs.length-2));
if (Pairs[Pairs.length-1] == SecondValues[0]){
Pairs[Pairs.length-1]=[Pairs[Pairs.length-1],Pairs[S][1]];
Pairs[S][1]=SecondValues[0];
}else{
Pairs[Pairs.length-1]=[Pairs[Pairs.length-1],SecondValues[0]]
}
</script>

this will create:

Pairs = [[3, 1], [2, 4], [4, 3], [1, 2]] or alike;