Avatar billede pixelpaw Nybegynder
24. juli 2001 - 13:15 Der er 10 kommentarer og
2 løsninger

funktion der laver array

Jeg efterlyser en funktion, der laver et array med tallene 1-x i tilfældig rækkefølge. Det samme tal må ikke optræde flere gange.
Avatar billede roenving Novice
24. juli 2001 - 13:31 #1
function RandomNumbers(x) {
  var numR = new Array(x);
  found = false;
  for (i=0; i<x; i++) {
      while !found {
        found = true;
        numR[i] = Math.floor(Math.random()*x)+1;
        for (j=0; j<i; j++) {
            if (numR[i]==numR[j]) {
              found = false;
            }
        }
      }
  }
}

Jeg har ikke lige testet, men da ideen i hvert fald er der håber jeg det er det du har brug for ;~}

jes
Avatar billede jakoba Nybegynder
24. juli 2001 - 13:37 #2

function lavPermutation ( tx ) {
  var tmp = new Array(\"a\");
  var lgt = tx.lengt;
  tx = \"_\" +tx +\"_\";
  for ( i=0; i<lgt; i++ ) {
    bogst = 1+Math.floor( Math.random * (tx.lgt-2) );
    tmp[i] = tx.charAt(bogst);
    tx = tx.substring(0,bogst)+tx.substring(bogst+1);
  };
  tmp = tmp.join(\"_\");
  tmp = tmp.replace( /_/g, \"\");
  return tmp;
}; //end lavPermutation ( string ) -> string

funktionen kaldes med en streng bestående af de cifre du vil have tilbag i tilfældig orden.


mvh JakobA
Avatar billede jakoba Nybegynder
24. juli 2001 - 13:40 #3
Ups. Hvor kom de tekst-strenge fra?
Avatar billede jakoba Nybegynder
24. juli 2001 - 13:50 #4
Forsent, men jeg skal da lige vise jeg kan :)

function lavPermutation ( fra, til ) {
  var tmp = new Array();
  var j = 0;
  for (var i=fra; i<=til; i++ ) tmp[j++] = i;
  var lgt = tmp.lengt;
  for (var i=0; i<lgt; i++ ) {
    valg = i+Math.floor( Math.random * (lgt-i) );
    j = tmp[valg];
    tmp[valg] = tmp[i];
    tmp[i] = j;
  };
  return tmp;
}; //end lavPermutation ( Number, Number ) -> Array of Number
Avatar billede roenving Novice
24. juli 2001 - 14:09 #5
Nåh...

det tog lige et stykke tid at gennemskue, hvad det var du lavede jakob ...

Men så opdagede jeg jo, at du slutter med en return tmp ;-[ Ups ... den havde jeg jo lige glemt:

Igen, igen:

function RandomNumbers(x) {
  var numR = new Array(x);
  found = false;
  for (i=0; i<x; i++) {
      while !found {
        found = true;
        numR[i] = Math.floor(Math.random()*x)+1;
        for (j=0; j<i; j++) {
            if (numR[i]==numR[j]) {
              found = false;
            }
        }
      }
  }
  return numR;
}


Avatar billede roenving Novice
24. juli 2001 - 14:18 #6
Men den løsning du kommer med (at lave en shuffle af værdierne -- har du ideen fra en kortblander ?-] ), burde jo alt andet lige være hrutigere -- og derfor at foretrække:

Da du kun kører to gange een gang igennem og ikke har nogen branching bør den være \'væsentlig\' hurtigere (ja, jeg tror man vil kunne *mærke* forskellen når vi kommer i nærheden af 6-cifrede tal, og sikkert registrere den ved omhyggelig måling på de små 5-cifrede !&#8776;] ),

altså du kører 2*x ture, jeg kører x*x/2 ture plus tester

Nåh, men det er nok ikke den sidste gang, man opdager, at ens umiddelbare ideer sagtens dur, men at andre løsninger kan være smartere -- specielt performance-mæssigt !!!

hth
jes
Avatar billede jakoba Nybegynder
24. juli 2001 - 14:30 #7
næe, algoritmen kommer fra da jeg skulle teste sorterings-routiner (for at lave inputdata til dem); men det er jo samme problem.

og lige for at kritisere lidt: Din worst-case går faktisk mod uendelig, hvis man er lidt uheldig med sine 1000000-sidede terningkast.

mvh JakobA
Avatar billede pixelpaw Nybegynder
21. august 2001 - 12:45 #8
wupty, havde glemt alt om dette spg

Jeg kan ikke få det til at virke. Jakob, kan jeg få dig til at lave en html side med koden (og eventuelt et div tag der skriver talene ud) og uppe den et sted (eller sende den til guldfisk@mail1.stofanet.dk)?
Avatar billede jakoba Nybegynder
21. august 2001 - 14:04 #9
min fejl. havde glemt  ()  efter  Math.random  funktionen.
http://hjem.get2net.dk/Jakob.Aggernaes/temp/exp91793.html

mvh JakobA
Avatar billede jakoba Nybegynder
21. august 2001 - 14:10 #10
Men Ronving huskede (), så det er faktisk ham der har det rigtigste svar (medmindre dit array skal være over 10000 tal langt)
Avatar billede roenving Novice
21. august 2001 - 14:12 #11
<=;·) tsk, tsk, tsk,

ska\' man nu også til at lære dig javascript-syntaks
Avatar billede pixelpaw Nybegynder
21. august 2001 - 17:23 #12
jeg har delt det op  :)

tak til jer begge!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester