zufall mit Ausnahme

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

mabox

Betreff: zufall mit Ausnahme

BeitragMo, Jul 07, 2008 16:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo, Ich will mehrmals zufällige Zahlen erstellen. wenn einmal eine Zahl erstellt ist soll genau diese beim nächsten (und den folgenden malen) mal nicht erstellt werden. Wie mache ich das?
Fujitsu-Siemens Laptop, 2Ghz Intel Core2Duo Prozessor, 2GB Ram, 120GB Festplatte, ATI Mobility Radeon X1400, Windows Vista Ultimate
www.mausoft.de.tl
Dönerfresser Homepage

Blitzprogger

BeitragMo, Jul 07, 2008 17:31
Antworten mit Zitat
Benutzer-Profile anzeigen
meinst du so?
Code: [AUSKLAPPEN]
.sprung

zahl = Rand(0,10)

While zahl = 5
 zahl = Rand(0,10)
Wend

Print zahl

If zahl = 5 Then End



If KeyDown(1) = 0 Then Goto sprung

End


edit: code editiert
Mein aktuelles Projekt, Irnithal: http://www.blitzforum.de/worklogs/415/

Unfreiwilliger Gewinner des BAC# 115. Wink
  • Zuletzt bearbeitet von Blitzprogger am Mo, Jul 07, 2008 17:38, insgesamt 2-mal bearbeitet

ozzi789

BeitragMo, Jul 07, 2008 17:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich weis nicht gerade schön doch es funktioniert ohne grosser aufwand Smile

Code: [AUSKLAPPEN]

SeedRnd Millisecs()


while not keyhit(1)


if not erstesmalblub =1 and blub
  zahl = Rnd (1,10)
    oldzahl=zahl
   erstesmalblub=1

if erstesmalblub =1 and blub
  zahl = Rnd (1,10)
     if zahl = oldzahl
        repeat
        zahl = Rnd (1,10)
        until zahl<> oldzahl
     endif

endif




Fragen zum Code ?



mfg ozzi789


@Blitzprogger

Ist richtig bis auf das du einfach 5 nimmst , woher wilst du wissen das beim ersten mal 5 rauskommt Wink
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5

Blitzprogger

BeitragMo, Jul 07, 2008 17:39
Antworten mit Zitat
Benutzer-Profile anzeigen
?
Die While-Schleife wird nur ausgeführt wenn die zahl = 5 ist, und dann solange bis sie nicht mehr 5 ist. Man kann statt 5 auch andere zahlen nehmen.

mfg
Mein aktuelles Projekt, Irnithal: http://www.blitzforum.de/worklogs/415/

Unfreiwilliger Gewinner des BAC# 115. Wink

hectic

Sieger des IS Talentwettbewerb 2006

BeitragMo, Jul 07, 2008 17:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Hab jetzt wohl umsonst mir die Mühe gemacht. Jedoch kann man hier den Sperrpuffer um beliebiege Stellen sperren lassen. Also je nachdem wie man es braucht. Für nur eine Zahl sperren ist mein Code sicherlich vielzu aufgebläht.

Code: [AUSKLAPPEN]
Graphics 400,600,0,2
SetBuffer FrontBuffer()


Const SPEICHER=3 ;Wert ist ##+1, also ##-1 angeben

Dim Puffer(SPEICHER)




For Q=1 To 40
   Print Zahl(0,6)
Next

Print "Taste drücken"
WaitKey
End







Function Zahl(FnZahl1#=0, FnZahl2#=7)
   
   If Abs(Abs(FnZahl1)-Abs(FnZahl2))<=SPEICHER Then
      RuntimeError "Wertenereich führt zu einer Endlosscheife"
   End If
   
   Local InLoop%
   Local InWert%
   Local InBack%
   
   Repeat
      InBack=0
      InWert=Floor(Rnd(FnZahl1,FnZahl2+1))
      For InLoop=0 To SPEICHER
         If Puffer(InLoop)=InWert Then InBack=1
      Next
   Until InBack=0
   
   For InLoop=1 To SPEICHER
      Puffer(InLoop-1)=Puffer(InLoop)
   Next
   Puffer(SPEICHER)=InWert
   
   Return InWert
End Function
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

ozzi789

BeitragMo, Jul 07, 2008 17:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Blitzprogger hat Folgendes geschrieben:
?
Die While-Schleife wird nur ausgeführt wenn die zahl = 5 ist, und dann solange bis sie nicht mehr 5 ist. Man kann statt 5 auch andere zahlen nehmen.

mfg



Und genau im meinem COde wird die zuerst "ausgewählte" Zahl auch im späteren RND verfahren nicht mehr berücksichtigt Smile


Tell me if im Wrong Shocked
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5

ChaosCoder

BeitragMo, Jul 07, 2008 17:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
SeedRnd MilliSecs()         ;Los gehts mit dem Zufallsgenerator

Global maxrnd%=10            ;Größte per Zufall generierbare Zahl (z.B. 10)
Dim used(maxrnd)            ;Erstellt ein Array, das sich merken wird, welche Zahlen bereits generiert worden sind

While i<maxrnd
   newrnd=Rand(0,maxrnd)      ;eine neue Zahl wird generiert
   While used(newrnd)         ;solange in dem array an der Stelle der neuen Zahl eine 1 steht,...
      newrnd=Rand(0,maxrnd)   ;...generiere eine neue Zahl
   Wend                  ;sollte die Zahl noch nicht generiert worden sein, so
   used(newrnd)=1            ;belege das Array in der Zelle mit dem Wert 1
   Print newrnd               ;gib die Zahl zum Test aus
   i=i+1
Wend

Flip;damit wir was sehen
WaitKey()                     ;warte gefälligst!


EDIT: zu spät -.-'
  • Zuletzt bearbeitet von ChaosCoder am Mo, Jul 07, 2008 17:53, insgesamt 2-mal bearbeitet
 

chi

BeitragMo, Jul 07, 2008 17:51
Antworten mit Zitat
Benutzer-Profile anzeigen
hilft dir das weiter?

Code: [AUSKLAPPEN]

SeedRnd(MilliSecs())
count=15
Dim array$(count)

For i=1 To count
   Select Len(i)
      Case 1
         nr$="0"+i
      Default
         nr=i
   End Select
   array(i)="text nr."+nr
Next

.loop
For i=1 To count
   r=Rand(i,count)
   temp$=array(i)
   array(i)=array(r)
   array(r)=temp$
   Locate 10,12*i
   Print array(i)   
Next

Locate 150,50
Print "mousebutton to recalculate"

WaitMouse
Cls
Goto loop

mabox

BeitragMo, Jul 07, 2008 17:57
Antworten mit Zitat
Benutzer-Profile anzeigen
soviel bekomme ich auch selber hin, aber die frage ist: wie mache ich es das sich eine Zahl nie wiederholt.

Dasheißt, dass es bei 10 Zahlen auch nur 10 Mölichkeiten gibt.
Klar könnte ich die Zahlen in Arrays speichern und jedes mal abfragen ob sie nicht mit der neuen Zufallszahl übereinstimmen, aber diese Methode sehr schlecht. Denn wenn 9 zahlen schon vorkamen und nur noch eine fehlt wird diese ja nicht automatisch vom Zufall als nächstes gewählt, deshalb braucht diese Methode unnötig viele Rechenvorgänge.

meine zweite Frage ist: wie kann ich das so machen, dass es keine unnötigen Rechenvorgänge macht?

EDIT Dieser Beitrag wurde geschrieben nachdem ich diesenZitat:
?
Die While-Schleife wird nur ausgeführt wenn die zahl = 5 ist, und dann solange bis sie nicht mehr 5 ist. Man kann statt 5 auch andere zahlen nehmen.

mfg
gelesen habe. Die anderen waren schneller. Die hab ich nicht gemeint
Fujitsu-Siemens Laptop, 2Ghz Intel Core2Duo Prozessor, 2GB Ram, 120GB Festplatte, ATI Mobility Radeon X1400, Windows Vista Ultimate
www.mausoft.de.tl
Dönerfresser Homepage
  • Zuletzt bearbeitet von mabox am Mo, Jul 07, 2008 18:12, insgesamt einmal bearbeitet

ozzi789

BeitragMo, Jul 07, 2008 17:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich dachte mein und Chaos Coders beispiel können das Shocked ?
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5

mabox

BeitragMo, Jul 07, 2008 18:12
Antworten mit Zitat
Benutzer-Profile anzeigen
sry ihr ward schneller
Fujitsu-Siemens Laptop, 2Ghz Intel Core2Duo Prozessor, 2GB Ram, 120GB Festplatte, ATI Mobility Radeon X1400, Windows Vista Ultimate
www.mausoft.de.tl
Dönerfresser Homepage

hectic

Sieger des IS Talentwettbewerb 2006

BeitragMo, Jul 07, 2008 18:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Ohne unnötige Rechenvorgänge macht kein Code das. Zumndest dann nicht, wenn mehrere ''letzte'' Zahlen als Sperrzahlen gelten. Auch kann man nicht auf ein Zwischenspeicher verzichten.

Das ganze gilt nicht, wenn man sich eine Formel ausdenkt, die Pseudozufallszahlen erstellt. Als Beispiel: Mod mit +3 für eine 10ner Konstelation. 0, 3, 6, 9, 2, 5, 8, 1, 4, 7, 0... Sowas kann man weiter ausbauen, was aber nie wirkliche Zufallszahlen sein werden.

Wer es aber ganz schnell haben möchte, der erstellt sich ein Array und speichert da vorberechnete Zahlen ein. Bei Abruf wird dann ab ein bestimmten Offset einfach ausgelesen.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

ChaosCoder

BeitragMo, Jul 07, 2008 18:18
Antworten mit Zitat
Benutzer-Profile anzeigen
japp hätte hectics gerade vorgeschlagen, einfach ne liste (in Blitz3D müssteste wohl ein Array nehmen), da alle möglichen Zahlen reinspeichern, das Array mischen, und einfach jedes mal nachdem ne Zahl aus dem Array am offset xy ausgelesen wurde, das offset um 1 erhöhen.
Projekte: Geolaria | aNemy
Webseite: chaosspace.de

Xeres

Moderator

BeitragMo, Jul 07, 2008 18:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Sind Zufallszahlen ohne Doupletten gemeint? dazu hab ich ein Codeschnipsel älteren Datums...Code: [AUSKLAPPEN]
anzahl = 24 ; höchste Zahl       
Dim POSITION(anzahl)
SeedRnd MilliSecs()
For i = 1 To anzahl
Repeat
present = False
gg = Rand(1,anzahl)
For z = 1 To anzahl
If gg = POSITION(z)
present = True
Exit
EndIf
Next
Until present = False
POSITION(i) = gg
Next
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)

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group