Avatar billede marrix Juniormester
30. april 2003 - 21:47 Der er 7 kommentarer og
1 løsning

Sortere tilfældigt

Hvordan sorterer jeg tallene fra 1 til (f.eks.) 50 i en tilfældig rækkefølge? På en simpel måde!

Jeg har forsøgt lidt med en random(50) funktion. Men den giver kun et tal ad gangen, og kørt gennem en løkke har jeg besvær med at forhindre, at det samme tal dukker op to eller flere gange (bliver et temmelig langt script for noget der egentlig burde være forholdsvis simpelt).

De allervenligste hilsener
Marianne
Avatar billede jakobclausen Nybegynder
30. april 2003 - 21:57 #1
Tror den eneste løsning er random() funktionen, som du selv nævner, men som du siger udskriver den kun ét tal, og du har ikke mulighed for at sikre dig at alle tal kommer med!
Avatar billede jmc Nybegynder
30. april 2003 - 22:15 #2
Med en random funktion kan du ikke sikre at et tal ikke dukker flere gange. Der bliver du nød til også at tjekke om tallet har været der før.
Avatar billede jakobclausen Nybegynder
30. april 2003 - 22:18 #3
www.bokaj.dk har jeg en lottotals generator liggende, som jeg har lavet i director, og der generere den et tilfældigt tal fra 1-33 (34), men hvis det genererede tal allerede er fundet, prøver den igen, indtil den kommer til et tal den ikke før har fundet.

det er lidt det samme du skal bruge i dette tilfælde. Hvis du er interesseret kan jeg godt sende dig filen!
Avatar billede jespernaur Nybegynder
30. april 2003 - 22:40 #4
Her er en løsning i en C-lignende dialekt - og den behøver IKKE at prøve flere gange for at undgå dubletter:

antal = 50;

/* opret array numre med alle de ønskede tal */
for (i = 0; i < antal; i++) {
  numre[i] = i + 1;
}

tilbage = antal;

for (i = 0; i < antal; i++) {
  /* lav et tilfældigt tal i intervallet  [0 < tal < tilbage] */

  /* Returner det fundne tilfældige tal */
  resultat[i] = numre[tal];

  /* Erstat det afleverede tal med det sidste tal i numre, og */
  /* tæl antallet af tilbageværende ned med 1.                */
  tilbage--;
  numre[tal] = numre[tilbage];
}
Avatar billede jespernaur Nybegynder
30. april 2003 - 22:41 #5
Ups der skulle have stået

  /* lav et tilfældigt tal i intervallet  [0 <= tal < tilbage] */
Avatar billede sparkl Nybegynder
30. april 2003 - 23:12 #6
list1 = []
list2 = []
repeat while list1.count < 50
  list1.add(list1.count+1)
end repeat
repeat while list1.count > 0
  randomValue = Random(1,list1.count)
  list2.add(list1[randomValue])
  list1.deleteat(randomValue)
end repeat

list1 kan være hvad som helst, i dette tilfælde er det tallene fra 1 til 50.
list2 fyldes ud med indholdet af list1 i tilfældig rækkefølge.
Avatar billede marrix Juniormester
01. maj 2003 - 10:39 #7
Tak for hjælpen til alle.
Den C-lignende effekt ser helt ok ud, men da jeg helst vil holde mig til Lingo vil jeg benytte mig af sparkl's løsning. Den virker perfekt, og er rimelig simpel. Tak.

Marianne
Avatar billede kanding Nybegynder
01. maj 2003 - 11:51 #8
Damned too late... ;-)
en lettere og hurtigere metode er:

on generateRandomList fromNum, toNum
  randomList =[]
  y = 1
  repeat with x = fromNum to toNum
    addAt(randomList, random(y), x)
    y = y + 1
  end repeat
  return(randomList)
end

så kan du bare lave en:
tilfaeldigListe = generateRandomList(1,50)
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
Kurser inden for grundlæggende programmering

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