Seite 1 von 2

Random List

Verfasst: 02.08.2019 16:35
von Muttonhead
Hallo @all:
Ich probier mal wieder ein wenig herum und habe eine Frage zu Listen.
Es gibt eine gut funktionierende Sortier-Funktion in PB für Listen.
Obwohl ich ein eigenes Listenhandling (so mit Adressengedööns, previous,next oder parent,child usw.) bevorzuge. Also wenn man was fasch machen kann, dann auch richtig:)

Zurück zur eigentlichen Frage meinerseits: Hat jemand schon mal ne Art "RandomList"-Prozedur für PB-native Listen realisiert?
oder hilft dabei einfach *RTFM*?

Mutton

Re: Random List

Verfasst: 02.08.2019 16:39
von RSBasic
Hallo Muttonhead,

vielleicht hilft dir dieser Thread: viewtopic.php?f=16&t=23928

Re: Random List

Verfasst: 02.08.2019 16:44
von STARGÅTE
Dafür gibt es nativ: RandomizeList()

Re: Random List:solved

Verfasst: 02.08.2019 17:05
von Muttonhead
vielen Dank euch beiden...
@STARG...((whatAE0).. ich bekomms grad nicht hin :) ) : genau nach sowas hab ich gesucht... in der Hilfe ist bei List nicht verlinkt

@RSBASIC: als Inspiration für ein ordentlich geschütteltes Index-Array als Jumplist. Finde ich iwie reizvoll.

Wie gesagt, dank euch beiden... solved!

Mutton

Re: Random List

Verfasst: 02.08.2019 19:31
von mk-soft
STARGÅTE hat geschrieben:Dafür gibt es nativ: RandomizeList()
Es gibt Sachen in Purebasic die ich noch gesehen habe...

Wofür braucht man den sowas?

Re: Random List

Verfasst: 02.08.2019 20:11
von Muttonhead
@mk: keine ahnung, derzeit versuch ich mich grad an einem Versuchsträger für einem Bin-Packing Problem.
Ich will einfach mal via BruteForce + Zeitlimiter versuchen, ein Optimum zu erreichen, dafür benötige ich so eine Random-Funktion. Ich weiß, andere haben darüber ne Doktorarbeit geschrieben.

Mutton

Re: Random List

Verfasst: 02.08.2019 20:31
von Derren
mk-soft hat geschrieben:
STARGÅTE hat geschrieben:Dafür gibt es nativ: RandomizeList()
Es gibt Sachen in Purebasic die ich noch gesehen habe...

Wofür braucht man den sowas?

Dito :D

kA. vielleicht für Spiele. Kartenspiele z.B. Oder eine Shuffle-Funktion für einen Player

Re: Random List:solved

Verfasst: 03.08.2019 11:03
von Nino
Muttonhead hat geschrieben:genau nach sowas hab ich gesucht... in der Hilfe ist bei List nicht verlinkt
Aber sicher ist das in der Hilfe zu Listen verlinkt: https://www.purebasic.com/german/docume ... index.html

Re: Random List

Verfasst: 05.08.2019 15:03
von diceman
Eine Möglichkeit ist es natürlich, die Liste zu randomisieren, und dann einfach mit FirstElement(myList()) das erste Element auszuwählen. Alternativ, wenn du dir ein zufälliges Element aus einer Liste herauspicken möchtest (meine bevorzugte Methode), geht das so:

Code: Alles auswählen

SelectElement(myList(), Random(ListSize(myList())-1))
Die -1 ist wichtig, da SelectElement() das erste Element mit 0 beziffert, ListSize() aber nur eine 0 zurückgibt, sofern die Liste leer ist); das heißt, wenn du bei einer Liste mit 5 Elementen mittels SelectElement() "Das fünfte Element" auswählen würdest, hätte dieses den Index 4, aber ListSize() würde bei einer Abfrage der Listengröße natürlich weiterhin eine 5 zurückgeben.
Ich habe mir für diese Zwecke ein Macro gebastelt (sehr hilfreich für pcg a.k.a. procedural content generation):

Code: Alles auswählen

Macro _SelectRandomElement(thisList)
    SelectElement(thisList, Random(ListSize(thisList)-1))
EndMacro
Eine strukturierte Liste nach der Größe eines bestimmten Attributes zu sortieren (im nachfolgenden Beispiel in aufsteigender Reihenfolge), müßte folgendermaßen gehen:

Code: Alles auswählen

Structure MY_STRUCT
    index.i
    someAttribute.i
EndStructure
NewList myList.MY_STRUCT()

For a = 1 to 10
    AddElement(myList())
    myList()\index = a
    myList()\someAttribute = Random(100,1)
Next 

SortStructuredList(myList(), #PB_Sort_Ascending, OffsetOf(MY_STRUCT\someAttribute), TypeOf(MY_STRUCT\someAttribute))

ForEach myList()
    Debug "" + myList()\index + ". " + myList()\someAttribute
Next

Re: Random List

Verfasst: 05.08.2019 17:02
von diceman
//EDIT:
Ey, ich bin blöd.
Warum sagt mir keiner, daß das da oben im Code NewList myList.MY_STRUCT() heißen muß, und nicht Define myList.MY_STRUCT() ... :roll: :wink:
Sorry, habe den Code oben von der Arbeit aus verfasst, ohne aktive PureBasic-Umgebung, in der ich das hätte testen können.
Sollte jetzt alles stimmen.