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
HerrHagen
User
Beiträge: 430
Registriert: Freitag 6. Juni 2008, 19:07

Beitragvon HerrHagen » Donnerstag 8. Januar 2009, 17:25

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

Beitragvon hendrikS » Donnerstag 8. Januar 2009, 18:24

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

Beitragvon str1442 » Donnerstag 8. Januar 2009, 18:38

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

Beitragvon Trundle » Donnerstag 8. Januar 2009, 18:46

`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

Beitragvon BlackJack » Donnerstag 8. Januar 2009, 19:41

@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

Beitragvon jonas » Donnerstag 8. Januar 2009, 20:22

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

Beitragvon str1442 » Donnerstag 8. Januar 2009, 20:48

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

Beitragvon BlackJack » Donnerstag 8. Januar 2009, 21:21

@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

Beitragvon numerix » Donnerstag 8. Januar 2009, 22:01

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

Beitragvon derdon » Donnerstag 8. Januar 2009, 22:07

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

Beitragvon EyDu » Donnerstag 8. Januar 2009, 22:15

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

Beitragvon str1442 » Freitag 9. Januar 2009, 11:50

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: 4866
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Beitragvon EyDu » Samstag 10. Januar 2009, 02:00

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

Beitragvon Darii » Samstag 10. Januar 2009, 10:11

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

Beitragvon HWK » Samstag 10. Januar 2009, 15:10

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

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder