Aus Zufallsgenerator etwas ausschließen

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

mic_touch

Betreff: Aus Zufallsgenerator etwas ausschließen

BeitragSa, Okt 11, 2008 16:52
Antworten mit Zitat
Benutzer-Profile anzeigen
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

Xeres

Moderator

BeitragSa, Okt 11, 2008 17:25
Antworten mit Zitat
Benutzer-Profile anzeigen
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
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

ozzi789

BeitragSa, Okt 11, 2008 17:30
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Wink
Ich weis das goto ist nicht elegant, aber nur zum zeigen wies geht



Edit :
Zu spät, da ichs zuerst noch schreiben must, mist Sad
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5
 

mic_touch

BeitragSa, Okt 11, 2008 17:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke für die Antworten.
ozzi789 hats dann noch gut erklärt.

PSY

BeitragSo, Okt 12, 2008 16:53
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Okt 12, 2008 18:49
Antworten mit Zitat
Benutzer-Profile anzeigen
@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 Wink





na gut die wahrscheinlichkeits rate das die zahl 34325 bei rnd(1,100000) zweimal kommt ist doch wohl eher klein Smile
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5

Holzchopf

Meisterpacker

BeitragSo, Okt 12, 2008 19:13
Antworten mit Zitat
Benutzer-Profile anzeigen
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 BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm

ozzi789

BeitragMo, Okt 13, 2008 9:22
Antworten mit Zitat
Benutzer-Profile anzeigen
@Holzchopf


Sehr interessant die Idee, thx für den Code, werd mal sehn ob ich das begreif Smile
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group