HILFE!! Hausaufgabe/ zahlenrate programm!!

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Benutzeravatar
BlackVivi
User
Beiträge: 762
Registriert: Samstag 9. Dezember 2006, 14:29
Kontaktdaten:

Rebecca hat geschrieben:Ja, Subprocess ist auch nicht das Problem. Aber wenn ich im Linux-Terminal mehrmals hintereinander
python -c "print id(9)%101"
eingebe, bekomme ich stets eine andere Zufallszahl heraus (jedesmal wird der Python-Interpreter neu gestartet -> neuer Adressraum). Wenn du diese Zeile mehrmals in die Dosbox eingibst, sollte jedesmal 32 herauskommen, und nichts anderes macht mein obiger Code. Einfach aus dem Grund, dass unter Win die Speicherverwaltung anders funktioniert.
http://paste.pocoo.org/show/98584/

Oo
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Das unterschiedliche Verhalten ist nicht allein vom Betriebssystem abhängig. Python 2.5 und 2.6 liefern bei mir verschiedene IDs, Python 3.0 immer die gleiche ...

Edit: Linux 2.6.27
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

Exakt die gleiche Python Version wie Rebecca (also auch um 19:46 nochwas kompiliert 60911), Debian, Linux 2.6.27.7 selbst gebaut und bekomme auch eine recht breite Verteilung.
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

BlackVivi hat geschrieben: http://paste.pocoo.org/show/98584/
Oo
War das erste ein Messfehler? :wink:
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
Benutzeravatar
BlackVivi
User
Beiträge: 762
Registriert: Samstag 9. Dezember 2006, 14:29
Kontaktdaten:

Rebecca hat geschrieben:
BlackVivi hat geschrieben: http://paste.pocoo.org/show/98584/
Oo
War das erste ein Messfehler? :wink:
Wenn ich das CMD-Fenster schließ... und nochmal öffne... ist das erste wieder 17 oO'' Und alle danach wieder 41....... Und ich schließ es wieder... gib wieder den Code ein... und es ist wieder 17 und danach 41. Ich bin ein ganz klein wenig verwirrt.
Benutzeravatar
HerrHagen
User
Beiträge: 430
Registriert: Freitag 6. Juni 2008, 19:07

Auf meinem WindowsXP System mit Python 2.5 kommt, wenn ich es direkt hintereinander ausführe immer die selbe Zahl raus. Es macht auch nichts wenn ich dazwischen viele Prozesse starte und Speicher beleg. Gerade hab ichs dann einfach nochmal probiert und es kam wieder ne neue Zahl.
Wäre mal interessant zu erfahren nach welchen System den Prozessen Speicher zugewiesen wird.
Benutzeravatar
hendrikS
User
Beiträge: 420
Registriert: Mittwoch 24. Dezember 2008, 22:44
Wohnort: Leipzig

Vielleicht kann jemand bei Codesnippets mal ein Besipiel einstellen, wozu sich id() ueberhaupt sinnvoll einsetzen lässt. Hat bei meinen Anwendungen bisher nie eine Rolle gespielt.
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

Code: Alles auswählen

        new_positions = {}

        for member in self.members:
            position_to_check = member.position

            try:
            *snip*

            new_positions[id(member)] = new_position
           
            # Important checks that may lead to abort

        for member in self.members:
            new_position = new_positions[id(member)]
Aus meinen Tetris Klon Tetrix0r. id() liefert nur die Speicheradresse zurück, was man damit macht musst du entscheiden.
Benutzeravatar
Trundle
User
Beiträge: 591
Registriert: Dienstag 3. Juli 2007, 16:45

`id()` liefert einfach eine Zahl, die eine Art Identität eines Objektes darstellen soll. Dass das die Speicheradresse ist, das ist lediglich ein Implementationsdetail.
"Der Dumme erwartet viel. Der Denkende sagt wenig." ("Herr Keuner" -- Bertolt Brecht)
BlackJack

@str1442: Hast Du bei den `member`-Objekten `__cmp__()` implementiert oder oder eine der "rich comparison"-Methoden?

Speicherbelegung bei vielfachen von 2, 4, oder 16 passiert aus Optimierungsgründen. Viele Architekturen greifen langsamer auf Werte zu, wenn sie nicht an solchen Grenzen ausgerichtet sind. Einige SIMD-Maschinenbefehle auf x86-Prozessoren funktionieren nur mit Daten, die an 16-Byte-Grenzen ausgerichtet sind. Das `malloc()` aus der GNU Standardbibliothek liefert auf x86-Architekturen AFAIK auch immer nur Zeiger, die auf 16-Byte-Grenzen ausgerichtet sind.
Benutzeravatar
jonas
User
Beiträge: 156
Registriert: Dienstag 9. September 2008, 21:03

Nabend
Ganz schön abgedriftet... :D
Ist der "dynastywarriors" hier überhaupt
noch in irgendeiner Form beteiligt :D ?
MfG Talas
PS: Nichtsdestotrotz ist die Diskussion
natürlich spannend^^
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

Hast Du bei den `member`-Objekten `__cmp__()` implementiert oder oder eine der "rich comparison"-Methoden?
Nein. In der Doku hab ich unter __cmp__ grade nur gesehen, daß bei Nichtvorhandensein dieser Magischen Methoden über die Objekt Identität (also wohl mittels id()) eine Gleichheit zwischen Objekten definiert wird. Aber ich sehe nicht worauf du hinaus willst?

Danke für die Info! Aber wenn es sowieso meist virtueller Speicher ist, so wäre es doch quatsch nur jedes zweite virtuelle Byte zu benutzen, das widerspricht ja dann dem (vorhin nachgelesenem ^_^) Konzept von virtuellem Speicher, dem Programm einen ganzen "virtuellen" Block mit Speicher zu geben.

@jonas: Naja er hat auf seine Mutter geschworen jeden Tag hier mitzulesen ... ;)
BlackJack

@str1442: Wenn Du an `__cmp__()` und `__hash__()` nichts änderst, dann bezieht sich beides auf die Objektidentität, d.h. Du kannst die Objekte selbst statt des `id()`-Ergebnisses verwenden. Also:

Code: Alles auswählen

new_positions[member] = new_position
Es wird ja nicht nur jedes zweite Byte benutzt, sondern nur die Anfänge von Werten die mehr als ein Byte belegen auf solchen Grenzen ausgerichtet. Technisch steckt dahinter, dass nicht einzelne Bytes adressiert werden, sondern grössere Einheiten. Und wenn ein Datenwort über solche Grenzen geht, müssen zwei Zugriffe gemacht werden. Die SIMD-Befehle, die Daten auf 16-Bytegrenzen erwarten, verarbeiten auch 16 Bytes auf einen Schlag.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Noch ein Nachtrag zum Thema "Zufallszahlen via id()":
Jython vergibt die IDs stets mit 1 beginnend mit fortlaufender Zählung.
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Dann macht das Spiel mit dem Zahlen raten nicht mehr ganz so viel Spaß...
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Ich hab' jetzt nicht genau nachgeschaut ob schon eine vorliegt, aber sonst eine weitere Prolog-Lösung:

Code: Alles auswählen

zahl :- write('Ich habe eine Zahl zwischen 1 und 100.\n'), R is random(100)+1, raten(R).
raten(R) :- write('Rate: '), read(X), write('\n'), evaluate(R,X).
evaluate(R,X) :- R==X, write('Richtig\n'); (X<R, T='Zu klein\n'; T='Zu gross\n'), write(T), raten(R).
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

Du kannst die Objekte selbst statt des `id()`-Ergebnisses verwenden.
Ja, gut, sofern man nichts an __cmp__, __hash__ oder den Rich Comparison Methoden ändert ist das Objekt als "immutable" einzustufen. Insofern benutze ich inzwischen solche einfachen Objekte auch direkt in Dictionaries als Keys, nur habe ich es in Tetrix0r nicht getan, und auch nicht dran gedacht, daß das möglich wäre. Da ich Tetrx0r bereits begonnen habe, als ich anfänglich Python gelernt habe, sieht der Quellcode sowieso an allen Ecken und Enden entsprechend aus, und es gäbe vieles, was ich inzwischen verbessern könnte, aber ich werde das Projekt wahrscheinlich ruhen lassen. Dennoch ist sowas eine mögliche Verwendung von id(), auch für "Mutable" Objekte, da man mit id() explizit nach Identität als nach Wert eine Dict Zuordnung aufbauen kann.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Wie konnten nur Applescript vergessen werden.

Code: Alles auswählen

set zufallsZahl to random number from 1 to 100

set zahlErraten to false
repeat until zahlErraten is true
    set temp to display dialog "Eine Zahl zwischen 1 und 100. Rate: " default answer ""

    set eingabe to text returned of temp
    set x to eingabe as number

    if x is equal to zufallsZahl then
        display dialog "richtig" buttons {"OK"}
        set zahlErraten to true
    else if x ist less than zufallsZahl then
        display dialog "zu klein" buttons {"OK"}
    else
        display dialog "zu gross" buttons {"OK"}
    end if
end repeat
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

Ich bin immer wieder fasziniert, dass man mit AppleScript tatsächlich sowas wie Programmieren kann.
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

So, ich habe mich einmal gequält: Hier befindet sich eine Version in 16-Bit-X86-Assembler. Turbo-Assembler erzeugt hieraus eine COM-Datei (d.h. für DOS) mit einer Länge von 281 Bytes. Wer keinen Assembler installiert hat, kann die fertige COM-Datei mit diesem Python-Script erstellen.
MfG
HWK
Antworten