Avatar billede cowboy Nybegynder
19. december 2006 - 13:34 Der er 14 kommentarer og
1 løsning

Random udtræk i array

Hej,

Jeg skal lave et et script der laver et udtræk af nedenstående array på 12 punkter.

var koordinator:Array = new Array();
koordinator[0] = {x:22, y:100};
koordinator[1] = {x:40, y:200};
koordinator[2] = {x:60, y:250};
koordinator[3] = {x:80, y:300};
koordinator[4] = {x:100, y:400};
o.s.v

//eks. på udtræk
Random_X_Y_værdi = x:100, y:400;

Da scriptet skal kører i loop med x antal sekunder i mellemrum(det har jeg styr på), skal det være et nyt udtræk den henter frem hver gang, så det må helst ikke være den samme værdi som den forrige.

Hvordan kan det lade sig gøre?
Avatar billede barklund Nybegynder
19. december 2006 - 13:58 #1
Hvis det primære handler om, at der ikke må komme to ens i træk (men at der gerne må rent tilfældigt komme 1,2,1,2,1,2), så kan du blot tage en tilfældig indtil den er forskellig fra den sidste. Hvis det er vigtigt, at du kommer dem alle sammen igennem før du starter forfra og gentager en af de første, så kan du shuffle array'et og poppe elementer af, indtil det er tomt (hvorefter du shuffler igen).

Så, hvad er vigtigst? Sidstnævnte kan også hackes lidt til at klare førstnævnte, og så vil begge mål blive opfyldt, men det bliver lidt langhåret :)

:)

--
Morten Barklund
Avatar billede cowboy Nybegynder
19. december 2006 - 14:12 #2
Barklund -- Du har ramt rigtigt med det første.
Avatar billede barklund Nybegynder
19. december 2006 - 14:35 #3
Well then, så kan du have noget med:

var last_pos:Number = -1;
function getNextPos():Point {
    var new_pos:Number;
    do {
        new_pos = Math.floor(Math.random() * koordinator.length);
    } while (new_pos == last_pos);
    return koordinator[new_pos];
}

Så kan du bruge den som:

var p:Point = getNextPos();

Og så kan du være sikker på at få et nyt punkt hver gang :)

--
Morten Barklund
Avatar billede cowboy Nybegynder
19. december 2006 - 14:41 #4
Jeg får en fejl i debug vinduet når jeg forsøger at kører den.

**Error** Scene=Scene 1, layer=Action, frame=1:Line 31: The class or interface 'Point' could not be loaded.
    function getNextPos():Point {

**Error** Scene=Scene 1, layer=Action, frame=1:Line 39: The class or interface 'Point' could not be loaded.
    var p:Point = getNextPos();

Total ActionScript Errors: 2     Reported Errors: 2


Jeg kører med Flash 7 2.0
Avatar billede barklund Nybegynder
19. december 2006 - 14:55 #5
import flash.geom.Point then :)
Avatar billede cowboy Nybegynder
19. december 2006 - 15:05 #6
Men du at jeg skal sætte dette ind i starten:

import flash.geom.Point;

Jeg har lige prøvet men får stadig en fejl.
Avatar billede barklund Nybegynder
19. december 2006 - 15:09 #7
Ah, du bruger flash 7? Ignorer point og ret fjern det eller ret det til Object begge steder :)
Avatar billede cowboy Nybegynder
19. december 2006 - 15:14 #8
var koordinator:Array = new Array();
koordinator[0] = {x:22, y:100};
koordinator[1] = {x:40, y:200};
koordinator[2] = {x:60, y:250};
koordinator[3] = {x:80, y:300};
koordinator[4] = {x:100, y:400};


var last_pos:Number = -1;
function getNextPos():Object {
    var new_pos:Number;
    do {
        new_pos = Math.floor(Math.random() * koordinator.length);
    } while (new_pos == last_pos);
    return koordinator[new_pos];
}

var p:Object = getNextPos();
trace (p);




Hvis jeg prøver at tracce (p), så får jeg:
[object Object]
Avatar billede barklund Nybegynder
19. december 2006 - 15:28 #9
Ja, selvfølgelig :) Det er jo et objekt med de to koordinater. Vil du have koordinater, skal du bruge p.x og p.y :)
Avatar billede cowboy Nybegynder
19. december 2006 - 15:32 #10
ahh, beklager. Den havde jeg ikke lige set.
Avatar billede cowboy Nybegynder
19. december 2006 - 17:27 #11
Det virker desværre ikke helt.
Her er koden:

var koordinator:Array = new Array();
koordinator[0] = {x:320, y:95};
koordinator[1] = {x:185, y:200};
koordinator[2] = {x:20, y:240};

koordinator[3] = {x:430, y:20};
koordinator[4] = {x:685, y:55};
koordinator[5] = {x:320, y:275};

koordinator[6] = {x:250, y:55};
koordinator[7] = {x:100, y:95};
koordinator[8] = {x:460, y:270};

koordinator[9] = {x:615, y:95};
koordinator[10] = {x:355, y:250};
koordinator[11] = {x:550, y:300};


var last_pos:Number = -1;
function getNextPos():Object {
    var new_pos:Number;
    do {
        new_pos = Math.floor(Math.random() * koordinator.length);
    } while (new_pos == last_pos);
    return koordinator[new_pos];
}

var p = getNextPos();
trace ("x :"+p.x);
trace ("y :"+p.y);
trace ("------");

Hvis jeg lade den kører så kommer den nogen gange med det samme resultat efter den anden.

eks.
------
x :250
y :55
------
x :250
y :55
------
Avatar billede cowboy Nybegynder
19. december 2006 - 18:01 #12
hvornår ligger den, den gamle værdi ned i "last_pos"?
Avatar billede cowboy Nybegynder
19. december 2006 - 22:44 #13
ok, jeg valgte at lave det på en anden måde. Jeg kunne ikke få det til at virke.
Nu kører jeg bare min array igennem fra start til slut og stater forfra.
Avatar billede barklund Nybegynder
20. december 2006 - 09:19 #14
Det kunne man jo mene, at den også skulle gøre (altså gemme i last_pos) - men du er da velkommen til at lave det på en anden metode :)
Avatar billede cowboy Nybegynder
20. december 2006 - 10:23 #15
Men kan du ikke fortælle mig hvor henne i koden at den ligge værdien ned i last_pos, så jeg kan forstå det?
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
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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