QBasic Problem Binäarzufallszahlen Erstellung

Soul Survivor™

Lieutenant
Registriert
Aug. 2007
Beiträge
632
Moin,

ich erstelle gerade ein Programm, was mir 6000 Zufallszahlen aus 100000 Zahlen (von 1 - 100000) generiert.

Ich komme jedoch nicht weiter hier ersteinmal der code:

cls

open #1

Randomize timer

zwischen = STRING(12500, CHR$(0))

for i = 1 to 6000

nochmal:

Zahl = INT(RND * 100000)

if zahl = 0 then goto nochmal // 0 darf nicht gezogen werden.
zahlteil = zahl / 8 // zahl wird geteilt, denn 1 Byte = 8 bit
If zahlteil <> INT(zahlteil) then //Wenn sie nicht gerade ist
zahlteil = INT(zahlteil) // gerade machen
neu = zahlteil * 8 //neu = zahlteil * 8 um mit ges = ... nachher den rest herauszubekommen, welches
Byte die Zahl nachher belegt
ges = zahl - neu - 1 // wie vorherige zeile beschrieben, -1 weil ich ein byte weiterspringen muss
zahlteil = zahlteil +1 // zahlteil++
else
ges = 8 - 1 // wenn sie gerade ist ges = 0
end if

hoch = 2 ^ ges //ab jetzt bin ich sicher

abtr$ = mid$(zwischen, zahlteil, 1)

ascii = ASC(abtr$)

undpruef = ascii AND hoch
If undpruef = hoch then
goto nochmal
end if





Print #1, zahl

next





Irgendetwas scheint mit den hoch nicht zu stimmen.

Das Problem ist ich soll diese Aufgabe so lösen.

Jedes Byte in 8 Bit aufteilen und wenn ein Bit schon einmal verwendet wurde, so soll das Programm erkennen, ob die Zahl schoneinmal gezogen wurde.

Der erste teil scheint ganz in Ordnung zu funktionieren aber
ab der Sache mit den Hoch komm ich nicht voran, ich hoffe ihr könnt helfen.
 
Zuletzt bearbeitet:
Irgendwie könntest du mal exakt Zeile für Zeile versuchen zu erklären, was du da machst, nach der Zeile Zahl = INT(RND*10000)

ich versteh da nur Bahnhof zudem ist mir unklar wie du dir über diese Bit-Betrachtung merken willst, welche Zahl schon gezogen wurde...

Die Frage ist... wofür brauchst du das denn genau?
(Edit: Deshalb, weil es je nach Fall evtl elegante Lösungen geben kann)


Edit: Und was ist eine Binärzufallszahl?
 
Zuletzt bearbeitet:
Andere Lösungen hab ich schon fertig, ich soll jedoch jede VAriante mal probieren.
 
Ich kann auch nur bedingt Folgen.
Vor allem die Sache mit den Binärfragmenten will mir nicht einleuchten.
Verallgmeinern kannst du das mit den 8 Bits nicht da deine Zahlen bei einer Größe von <=100.000 aus bis zu 17 Bits bestehen.
Und 17 Bits > 1 Byte
 
100.000 / 8 = 12.500 = zwischen$

Deshalb habe ich ja eine Variable mit 12.500 Bit Nullen, wegen CHR$(0)


Habs noch ein wenig editiert.


jetzt fehlt mir eigentlich nurnoch, dass ich das bit als 1 setze.

Und das ich abtr$ wieder zurücksetze
 
Ich glaube du hast das Prinzip der Binärrechnung nicht richtig verstanden (Oder ich kann absolut 0 folgen)

100.000 (Dezimal) = 11000011010100000 (Binär)
Dies Binärzahl enthält 17 Bits
 
Guck mal, ich habe doch 100.000 mögliche Zahlen.

Diese teile ich durch 8 = 12.500

Das acht 12.500 Bytes jedes dieser Bytes hat 8 Bit.

Welches Byte ich nehemn muss ergibt sich aus zahl - neu -1.

Bei diesem betroffenen Byte wird das zu besetzende Bit erforscht.

klappt auch soweit, bloß ich weiß nicht wie ich zu diesem Bit springen kann und dieses somit auf 1 setze, damit das Programm es später als doppelt erkennt.
 
So langsam versteh ich was du vor hast, das hättest du aber vielleicht am Anfang einfach etwas klarer schreiben können...

Jede Zahl von 1 bis 100.000 wird durch ein Bit in deinem Bit-Feld, welches als String realisiert wird, repräsentiert.

Wo setzst du denn dann eigentlich das entsprechende Bit in deinem Bitfeld auf 1? Nirgends..
Vielleicht verstand deshalb keiner so richtig den Ansatz, weil wichtige Dinge fehlen..

funktioniert das hier vielleicht? habs noch nicht getestet... hab kein QBasic drauf

Ach ja: Die Origanisation des Bitfelds als String ist total krank... wenn ein einzelnes Zeichen geändert wird (und das wird es ja 6000 Mal) wird jedes Mal ein neuer String angelegt usw...

Code:
cls

open #1

Randomize timer

Dim bitfeld(12500) as shortint     // oder irgendwas mit byte-breite halt

for i = 1 to 6000

	nochmal:
	
	Zahl = INT(RND * 100000)
	
	if zahl = 0 then goto nochmal // 0 darf nicht gezogen werden.
	
	bitfeldindex = INT(zahl / 8)   // ganzzahlige Division
	bitnummer = zahl % 8       // Modulus/Rest der Division
	bitwert = 2 ^ bitnummer
	
	bitfeldwert = bitfeld(bitfeldindex)
	
	if ((bitfeldwerd AND bitwert) = bitwert) then
	  goto nochmal
	end if
	
	bitfeldwert = bitfeldwert OR bitwert
	
                bitfeld(bitfeldindex) = bitfeldwert
	
	Print #1, zahl
next
 
Joa, zu einer ähnlichen Lösung kam ich auch, jetzt funktioniert es.

Sorry, dass ich mich nicht verständlich genug ausgedrückt habe ;).
 
Zurück
Oben