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

Was für ein Spaß! 90 8)

Code: Alles auswählen

r=a=id(9)%101
while a:g=input();a=g!=r;print["geschafft",["zu klein","zu gross"][g>r]][a]
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

Das funktioniert aber nicht wenn die Pseudozufallszahl 0 ist, sonst hätt ich gleich while r+1 und if g==r: r = -1 benutzt :P
Benutzeravatar
hendrikS
User
Beiträge: 420
Registriert: Mittwoch 24. Dezember 2008, 22:44
Wohnort: Leipzig

Mit 81 Antworten und ueber 2000 Aufrufen hat es unser Schueler mit seinem HALLO WELT Programm wirklich weit gebracht. Respekt!

Eine Frage zu der zuletzt vorgestellten Methode zur Generierung einer Zufallszahl.

Code: Alles auswählen

r=a=id(9)%101
Ich fuerchte, dass das nicht wirklich funktioniert. Bei 5 Programmtests wurde immer dieselbe Zahl gewählt ( 48 ). Nicht besonders zufällig???
Benutzeravatar
HerrHagen
User
Beiträge: 430
Registriert: Freitag 6. Juni 2008, 19:07

Stimmt. Denkfehler, ich dachte a wird die id zugewiesen...
Readability counts. :wink:
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

@hendrikS: id() liefert die Memory Adresse eines Objektes zurück, durch Module 101 wird der Rest, der beim Teilen von <adresse> / 101 entsteht, zurückgeliefert, es entsteht also eine Zahl zwischen 0 und 100. Da der Interpreter int() Zahlen in einem bestimmten Bereich speichert, funktioniert das nur wenn der Interpreter jedesmal neu gestartet wird, damit "9" eine neue Adresse bekommt.
Benutzeravatar
HerrHagen
User
Beiträge: 430
Registriert: Freitag 6. Juni 2008, 19:07

hendrikS hat geschrieben:Mit 81 Antworten und ueber 2000 Aufrufen hat es unser Schueler mit seinem HALLO WELT Programm wirklich weit gebracht. Respekt!

Eine Frage zu der zuletzt vorgestellten Methode zur Generierung einer Zufallszahl.

Code: Alles auswählen

r=a=id(9)%101
Ich fuerchte, dass das nicht wirklich funktioniert. Bei 5 Programmtests wurde immer dieselbe Zahl gewählt ( 48 ). Nicht besonders zufällig???
Bei mir kommt 11 raus... :wink:
id gibt die Adresse im Speicher (zumindest bei cPython) zurück. Die ist unter normalen Umständen erstmal mehr oder weniger zufällig. Wenn du das Programm mehrfach hintereinander startest ohne das der Speicherbereich in der Zwischenzeit anderweitig belegt wurde, bekommst du vmtl. wieder die selbe Adresse und damit die gleiche "Zufallszahl" zugewiesen. Die Generierung von Zufallszahlen mit dieser Methode ist für eine vernünftige Anwendung natürlich Quatsch, dafür aber schön kurz :wink:.
Starte mal neu oder versuch anderweitig deinen Speicher umzuordnen. Es wird eine andere Zahl rauskommen.

MFG HerrHagen
BlackJack

@str1442: Selbst das ist nicht garantiert, da wir ja bei den meisten Rechnern von virtuellem Speicher reden und der ja sozusagen bei jedem Programmstart komplett leer ist, es also durchaus sein kann, dass das `int`-Exemplar 9 bei jedem Programmstart an der gleichen Adresse landet. Ausserdem würde ich erwarten, dass bei den meisten Architekturen Objekte an durch 2, 4, oder 16 teilbaren Adressen liegen werden. Das schränkt die Ratemöglichkeiten mindestens auf nur gerade Zahlen ein.

@sebastinas: Okay, dann ist es eben theoretisch unportabel. Praktisch ist mir noch kein C-Compiler untergekommen, der das nicht kompiliert.
Benutzeravatar
HerrHagen
User
Beiträge: 430
Registriert: Freitag 6. Juni 2008, 19:07

BlackJack hat geschrieben:Das schränkt die Ratemöglichkeiten mindestens auf nur gerade Zahlen ein.
Nö. Geht trotzdem, es wird ja nicht die Adresse direkt verwendet:

Code: Alles auswählen

>>> 146556 % 101  # Adresse durch 4 teilbar
5
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Das wollte ich jetzt mal genauer wissen, 10.000 Zufallszahlen mit der id-Methode verteilten sich bei mir wie folt:

Code: Alles auswählen

[100, 104, 113, 95, 77, 113, 101, 99, 91, 101, 94, 87, 94, 115, 123, 76, 97, 109, 111, 88, 103,
 111, 107, 104, 95, 99, 107, 109, 97, 86, 102, 103, 103, 88, 91, 88, 96, 102, 95, 95, 102, 99, 
106, 78, 124, 93, 108, 112, 98, 103, 84, 111, 97, 100, 89, 85, 109, 88, 105, 97, 113, 93, 99, 
96, 92, 113, 96, 91, 109, 90, 108, 104, 73, 94, 89, 84, 88, 90, 107, 109, 91, 100, 96, 92, 84, 
114, 97, 105, 103, 103, 100, 92, 99, 108, 99, 104, 111, 104, 99, 111, 93]
Das sieht auf den ersten Blick doch gar nicht so schlecht aus... Hat jemand Lust auf Statistik? :wink:

Hier der Code
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
Benutzeravatar
hendrikS
User
Beiträge: 420
Registriert: Mittwoch 24. Dezember 2008, 22:44
Wohnort: Leipzig

Folgendes hallo welt Programm:

Code: Alles auswählen

for i in range(10):print id(9)
10mal das Gleiche. Nicht brauchbar zur Generierung von Zufallszahlen.
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

Ausserdem würde ich erwarten, dass bei den meisten Architekturen Objekte an durch 2, 4, oder 16 teilbaren Adressen liegen werden. Das schränkt die Ratemöglichkeiten mindestens auf nur gerade Zahlen ein.
Warum den das? Obwohl, der Python Interpreter alloziert afair Speicher in größeren, vermutlich aus einer geraden Anzahl von Bytes bestehenden, Grüppchen, die er dann verwaltet - deswegen?

@Rebecca sieht bei mir ähnlich aus :)

ADD:

@hendrikS: Ja, in der gleichen Session - man würde diese Methode vermutlich auch nicht produktiv benutzen (es sei denn man ist gesottener C Programmierer), aber für das "Golfspiel" war es eine nette Möglichkeit, zumindest halbwegs funktionierend Zufallszahlen zu generieren - auch wenn es da je nach Betriebssystem / Speicherverwaltung Einschränkungen geben könnte.
Zuletzt geändert von str1442 am Donnerstag 8. Januar 2009, 15:08, insgesamt 1-mal geändert.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

hendrikS hat geschrieben:Folgendes hallo welt Programm:

Code: Alles auswählen

for i in range(10):print id(9)
10mal das Gleiche. Nicht brauchbar zur Generierung von Zufallszahlen.
Na das wurde hier doch nun zur Genüge abgehandelt ... :roll: str1442 hat Dir sogar explizit geantwortet!
Benutzeravatar
HerrHagen
User
Beiträge: 430
Registriert: Freitag 6. Juni 2008, 19:07

Hat jemand Lust auf Statistik? :Wink:
Das musste ja soweit kommen...

Code: Alles auswählen

Z = [100, 104, 113, 95, 77, 113, 101, 99, 91, 101, 94, 87, 94, 115, 123, 76, 97, 109, 111, 88, 103,
 111, 107, 104, 95, 99, 107, 109, 97, 86, 102, 103, 103, 88, 91, 88, 96, 102, 95, 95, 102, 99,
106, 78, 124, 93, 108, 112, 98, 103, 84, 111, 97, 100, 89, 85, 109, 88, 105, 97, 113, 93, 99,
96, 92, 113, 96, 91, 109, 90, 108, 104, 73, 94, 89, 84, 88, 90, 107, 109, 91, 100, 96, 92, 84,
114, 97, 105, 103, 103, 100, 92, 99, 108, 99, 104, 111, 104, 99, 111, 93]
n = float(sum(Z))
r = float(len(Z))
print sum([((z-(n/r))**2)/(n/r) for z in Z])
http://www.mathematik.uni-ulm.de/stocha ... ode27.html
http://psydok.sulb.uni-saarland.de/voll ... at/chi.htm
Ergibt eine Testgröße von T=97.55 für den Chi-Quadrat-Test.
Das ergibt ein Signifikanzniveau von 55,05% für die Nichtablehnung der Gleichverteilung.
Nich sooo toll... oder hab ich mich vertan? *lange_nicht_gemacht* *hust*
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

hendrikS hat geschrieben:Folgendes hallo welt Programm:

Code: Alles auswählen

for i in range(10):print id(9)
10mal das Gleiche. Nicht brauchbar zur Generierung von Zufallszahlen.
Hast du die letzten Beiträge gelesen? Und verstanden?
Natürlich kommt so 10x das gleiche heraus. Du musst das Programm NEU STARTEN. Dann kommt - wenn du nicht gerade Pech hast - eine andere Zahl heraus ...


Edit: Ups, hatte die letzte Seite des Threads noch nicht entdeckt ... hatte sich schon erledigt. :oops:
Benutzeravatar
hendrikS
User
Beiträge: 420
Registriert: Mittwoch 24. Dezember 2008, 22:44
Wohnort: Leipzig

Ich hatte schon alles dazu gelesen. Hatte mich nur gefragt wie rebecca Ihre 10000 Zahlen generiert hat. Wahrscheinlich nicht durch 10000 einzelne Aufrufe. Aber auch bei jedem einzelnen Aufruf ist es immer gleich.
Thema ist fuer mich erledigt.
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Hab doch extra den Code gepostet:
Rebecca hat geschrieben: Hier der Code
Ich mache jedes Mal einen neuen Interpreter-Aufruf.
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
Benutzeravatar
hendrikS
User
Beiträge: 420
Registriert: Mittwoch 24. Dezember 2008, 22:44
Wohnort: Leipzig

Dein Programm sieht smart aus. Der output ist aber irgendwie seltsam. Bei 1000 Schleifendurchläufen.

[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

Habe ich noch nicht ganz verstanden.
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Ah, das ist interessant. Bei dir scheint der Python-Interpreter immer genau den gleichen Adressraum zu bekommen. Was fuer ein System nutzt du?

Mein Ergebnis kommt von einem Linux 2.6.26-1-686 mit

Code: Alles auswählen

Python 2.5.2 (r252:60911, Nov 14 2008, 19:46:32)
[GCC 4.3.2] on linux2
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
Benutzeravatar
hendrikS
User
Beiträge: 420
Registriert: Mittwoch 24. Dezember 2008, 22:44
Wohnort: Leipzig

Mein OS: Windows XP
Python: 2.5

Der subprocess stuff sollte aber OS unabh. sein, dachte ich.
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

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.
Zuletzt geändert von Rebecca am Donnerstag 8. Januar 2009, 16:43, insgesamt 1-mal geändert.
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
Antworten