Aus Zufallsgenerator etwas ausschließen
Übersicht

mic_touchBetreff: Aus Zufallsgenerator etwas ausschließen |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ich habe etwas geschrieben und nun komm ich nicht weiter.
Also ich habe eine Schleife und einen Zufallsgenerator, der aussucht z.B. welches Blid dran kommt. Wie bekomm ich es hin dass wenn er das bild schon einmal genommen hat, es dann ausschließt, und der Generator nur noch die anderen verwendet? Das sieht ungefähr so aus: Code: [AUSKLAPPEN] Graphics 800,700,16,2 SeedRnd MilliSecs() For start=1 To 2 zahl = Rand(1,3) Select zahl Case 1 bild1 = LoadImage ("...") DrawImage bild1 cls Case 2 bild2 LoadImage ("...") DrawImage bild1 cls Case 3 bild3 LoadImage ("...") DrawImage bild1 cls End Select Next waitkey end |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Immer wenn jemand danach fragt, muss ich in altem Code wühlen... diesmal hab ich's gespeichert...
Hier ein Beispiel: Code: [AUSKLAPPEN] Local maximum=9
Dim arr(maximum) SeedRnd MilliSecs() For i = 1 To maximum Repeat present = False gg = Rand(1,maximum) For z = 1 To maximum If gg = arr(z) present = True Exit EndIf Next Until present = False arr(i) = gg Next For i=0 To maximum Print "Feld Nr "+i+" beinhaltet "+arr(i) Next WaitKey() Der Array "arr" wird mit einer zufälligen Zahl befüllt und dann geprüft, ob diese Zahl schon im Array vertreten ist. Ich hoffe du kannst damit was passables anstellen. |
||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
ozzi789 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Code: [AUSKLAPPEN] Graphics 640,480
SeedRnd MilliSecs() Dim zahlen(10) ;Dim Feld erstellen For i = 1 To 10 .again neuezahl= Rnd (1,10) ;Zufällige Zahl For a = 1 To 10 If neuezahl=zahlen(a) ;Falls die Zahl im Dimfeld enthalten ist Print "doppelte zahl gefunden nämlich die "+neuezahl Goto again ;Die ganze Prodzedur nochmal EndIf Next zahlen(i)=neuezahl ;Jetzt da wir uns sicher sind das sie nicht doppelt vorkommt, ins dim speichern Next Print "" For i = 1 To 10 Print "Zahl-"+i+" ="+zahlen(i) ;So können wir testen, von 10 zahlen keine doppelte dabei ;) Next So sollt es stimmen, bin ein wenig müde ![]() Ich weis das goto ist nicht elegant, aber nur zum zeigen wies geht Edit : Zu spät, da ichs zuerst noch schreiben must, mist ![]() |
||
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5 |
mic_touch |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Danke für die Antworten.
ozzi789 hats dann noch gut erklärt. |
||
![]() |
PSY |
![]() Antworten mit Zitat ![]() |
---|---|---|
hoi,
bei grösseren zufallszahlen-mengen musst du dir allerdings eine andere lösung überlegen, da die o.g. dann zu zeitaufwendig wären, und ausserdem von der benötigten rechenzeit schlecht kalkulierbar. wenn du aber nur aus 10 oder 100 zahlen zufällig auswählst, faellts zeitmässig eh nicht auf. l8er, psy |
||
![]() |
ozzi789 |
![]() Antworten mit Zitat ![]() |
---|---|---|
@psy
das is mia klar, den du must ja alle überprüfen, drum hab ich ja nur die überprüft die es schon hat nicht noch das ganze dim feld. Doch bei grossen zahlen wird es zeitaufwändig, gibts da ne andere lösung ? Tut mich gerad interessieren ![]() na gut die wahrscheinlichkeits rate das die zahl 34325 bei rnd(1,100000) zweimal kommt ist doch wohl eher klein ![]() |
||
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5 |
![]() |
HolzchopfMeisterpacker |
![]() Antworten mit Zitat ![]() |
---|---|---|
Für grössere Zahlenmengen würde ich folgendes Prinzip wählen:
1. Man erstellt einen Pool mit allen Elementen, die man haben will (zB jede Zahl von 0 -99 und zwar jede genau einmal). 2. Man pickt sich zufällig Elemente aus dem Pool raus und entfernt diese dabei aus dem Pool. 3. Sobald der Pool leer ist, füllt man den Pool wieder auf. Beispiel (funktioniert auch mit 10000 Einträgen): Code: [AUSKLAPPEN] Const Entries = 100
Local Bank = CreateBank() InitRnd( Bank, Entries ) Local v While v <> -1 v = GetRnd( Bank ) DebugLog v Wend Stop End ; Erstellt den Pool mit definierter Grösse Function InitRnd( Pool, Size ) Local a ResizeBank Pool, Size *4 For a = 0 To Size -1 PokeInt Pool, a *4, a Next SeedRnd MilliSecs() End Function ; Liefert eine Zufallszahl Function GetRnd( Pool ) Local Size = BankSize( Pool ) /4 ; Wenn der Pool leer ist, -1 zurückgeben If Size = 0 Then Return -1 ; Zufällige Zahl ermitteln Local Pntr = Rand( 0, Size -1 ) Local Val = PeekInt( Pool, Pntr *4 ) ; Zahl aus dem Pool entfernen CopyBank Pool, Pntr *4 +4, Pool, Pntr *4, (Size -Pntr) *4 -4 ResizeBank Pool, Size *4 -4 Return Val End Function (ohne Gewähr, aber das Prinzip sollte so stimmen) MfG |
||
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BY ♫ BinaryBorn - Yogurt ♫ (31.10.2018) Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm |
![]() |
ozzi789 |
![]() Antworten mit Zitat ![]() |
---|---|---|
@Holzchopf
Sehr interessant die Idee, thx für den Code, werd mal sehn ob ich das begreif ![]() |
||
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group