Zufallsgenerator in C für 0-2

Schnelle objektorientierte, kompilierende Programmiersprache.
Digitalsheep
Beiträge: 8
Registriert: Sa Jan 09, 2021 10:36 pm

Zufallsgenerator in C für 0-2

Beitrag von Digitalsheep » Sa Jan 09, 2021 10:53 pm

Folgender Code müsste mir doch eigentlich bei:
1. bei unbetrag eine Zahl zwischen -9 und +9
2. bei unbetrag2 dessen Quadrat also eine Zahl wischen 0 und 81
3. bei betrag den betrag der Zahl von 1. ergeben
4. sollte hier eine null herauskommen die schleife ab do wiederholen, bis...
5. bei betrag2 eine Zahl zwischen inkl. 0-2 ergeben mit relativ gleichverteilter Wahrscheinlichkeit.

Kann mir jemand erklären warum es dass aber nicht tut?
C ist escht widerporstig und von char arrays reden wir noch gar nicht :lol:

Beispielhafter Output in der Konsole:

unbetrag1:634961976
unbetrag2:634961980
betrag:634961984
unbetrag5:634961988

Code:

Code: Alles auswählen

#include <stdio.h>
#include <stdint.h>
#include <time.h>
#include <stdlib.h>

int main(void){
               int unbetrag, unbetrag2, betrag, betrag2;
	       
		do {
		srand(time(0));
		unbetrag = (rand()%10);
	        unbetrag2 = ("%d * %d",&unbetrag,&unbetrag);
                betrag = (unbetrag2 / unbetrag2);
           	}while (betrag == 0);
		
		betrag2 = ("%d %3", &betrag);
Edit by Xin: Codetags eingefügt
Dont blame the code, blame the compiler!

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8858
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Zufallsgenerator in C für 0-2

Beitrag von Xin » So Jan 10, 2021 12:41 am

Digitalsheep hat geschrieben:
Sa Jan 09, 2021 10:53 pm
Folgender Code müsste mir doch eigentlich bei:
1. bei unbetrag eine Zahl zwischen -9 und +9
Was steht denn da drin? Gibt das doch mal mit printf aus! :-)
Digitalsheep hat geschrieben:
Sa Jan 09, 2021 10:53 pm
2. bei unbetrag2 dessen Quadrat also eine Zahl wischen 0 und 81
Hier...

Code: Alles auswählen

unbetrag2 = ("%d * %d",&unbetrag,&unbetrag);
...muss ich selbst erstmal überlegen, was da rauskommt. :-D
Da kommt die Adresse von unbetrag raus. Also irgendwas ziemlich großes...

C ist gar nicht so widerspenstig, die Sache ist deutlich einfacher:

Code: Alles auswählen

unbetrag2 = unbetrag * unbetrag;
Digitalsheep hat geschrieben:
Sa Jan 09, 2021 10:53 pm
3. bei betrag den betrag der Zahl von 1. ergeben
Da steht x/x und das sollte 1 sein.
Digitalsheep hat geschrieben:
Sa Jan 09, 2021 10:53 pm
4. sollte hier eine null herauskommen die schleife ab do wiederholen, bis...
Ich denke, da gehst Du selbst nochmal ran, wenn 1-3 klarer sind. :-D
Digitalsheep hat geschrieben:
Sa Jan 09, 2021 10:53 pm
5. bei betrag2 eine Zahl zwischen inkl. 0-2 ergeben mit relativ gleichverteilter Wahrscheinlichkeit.
Mich würde hier mal interessieren, welche Erwartung Du bei dem Befehl hast.
betrag2 = ("%d %3", &betrag);
Digitalsheep hat geschrieben:
Sa Jan 09, 2021 10:53 pm
Kann mir jemand erklären warum es dass aber nicht tut?
C ist escht widerporstig und von char arrays reden wir noch gar nicht :lol:
Ein paar Punkte könnten jetzt verständlicher sein.

Programmieren lernen bedeutet, dass man sehr viele Möglichkeiten lernt, wie es nicht funktioniert. Und von daher bist Du doch auf dem richtigen Weg. :-)
Es dauert eine Zeit, aber es wird kommen.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Digitalsheep
Beiträge: 8
Registriert: Sa Jan 09, 2021 10:36 pm

Re: Zufallsgenerator in C für 0-2

Beitrag von Digitalsheep » So Jan 10, 2021 1:54 pm

Erstmal danke für deine Antwort
tatsächlich funktioniert es jetzt mehr oder weniger dank deinem Hinweis mit x/x.
Es hätte heissen müssen y=x*x und dann z = y/x (Quadratwurzel um positiven Betrag zu erhalten).
Und dass hat dann mein verzweifeltes rumgefuchtel mit Adressoperatoren etc. beendet, weil endlich vernünftige Werte herauskommen.
Modulo 3 liefert dann eine tenäre Logik {0;1;2} aus.
Da bei Modulo 3 aber die 0 im Verhältnis 5:2:2 überrepräsentiert ist habe ich die While-Schleife eingebaut,
so dass im Falle eine eingangs aus Modulo 10 des Zufallswertes ergebene 0 aus {-10;+10} die Zahl nochmal würfelt.
Bleibt gegenwärtig also ein Verhältnis von 3:2:2, vielleicht fällt mir noch ein Schritt ein das auch noch komplett auszugleichen.

Soweit klar?

Jetzt funktioniert es zwar, gelegentlich wirft es aber noch eine floating express exception zum Abbruch aus.
Hast du einen Tip woran das liegen kann?

p.S. Hab den Text vor dem Einloggen eingegeben... das Fenster war noch von gestern offen. Etwas ärgerlich dass der Text verschwand, allerdings war er quasi per Seite zurück noch wiederholbar. Vielleicht lässt sich im CMS das doch einstellen dass das automatisch mit durch den Login mitgenommen wird? Lesen hier auch Mods und admins?
Dont blame the code, blame the compiler!

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8858
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Zufallsgenerator in C für 0-2

Beitrag von Xin » So Jan 10, 2021 10:32 pm

Digitalsheep hat geschrieben:
So Jan 10, 2021 1:54 pm
Erstmal danke für deine Antwort
tatsächlich funktioniert es jetzt mehr oder weniger dank deinem Hinweis mit x/x.
Es hätte heissen müssen y=x*x und dann z = y/x (Quadratwurzel um positiven Betrag zu erhalten).
Häh?
Wenn x == -1 ist, dann ist y = 1 und z wieder -1?
Was spricht gegen if( x < 0 ) x*=-1; ?
Digitalsheep hat geschrieben:
So Jan 10, 2021 1:54 pm
Und dass hat dann mein verzweifeltes rumgefuchtel mit Adressoperatoren etc. beendet, weil endlich vernünftige Werte herauskommen.
Modulo 3 liefert dann eine tenäre Logik {0;1;2} aus.
Okay, das sollte also

Code: Alles auswählen

betrag2 = betrag %3;
heißen.
Digitalsheep hat geschrieben:
So Jan 10, 2021 1:54 pm
Da bei Modulo 3 aber die 0 im Verhältnis 5:2:2 überrepräsentiert ist habe ich die While-Schleife eingebaut,
so dass im Falle eine eingangs aus Modulo 10 des Zufallswertes ergebene 0 aus {-10;+10} die Zahl nochmal würfelt.
Bleibt gegenwärtig also ein Verhältnis von 3:2:2, vielleicht fällt mir noch ein Schritt ein das auch noch komplett auszugleichen.

Soweit klar?
Nicht wirklich, wenn Du eine Zufallszahl zwischen 0 und 2 haben willst, warum nimmst Du einen Bereich aus -10 bis +10? Würdest Du einen Bereich wählen, der entweder gleich verteilt ist ( zum Beispiel -8 bis +9 ) oder eben von 0 bis 2?
Digitalsheep hat geschrieben:
So Jan 10, 2021 1:54 pm
Jetzt funktioniert es zwar, gelegentlich wirft es aber noch eine floating express exception zum Abbruch aus.
Hast du einen Tip woran das liegen kann?
Floating express exception??
Keine Ahnung, aber ich würde mal grob schätzen, Du teilst durch Null.
Digitalsheep hat geschrieben:
So Jan 10, 2021 1:54 pm
p.S. Hab den Text vor dem Einloggen eingegeben... das Fenster war noch von gestern offen. Etwas ärgerlich dass der Text verschwand, allerdings war er quasi per Seite zurück noch wiederholbar. Vielleicht lässt sich im CMS das doch einstellen dass das automatisch mit durch den Login mitgenommen wird? Lesen hier auch Mods und admins?
Hier lesen auch Mods und Admins. :-)
Ich zum Beispiel.

Aber wir haben das CMS nicht geschrieben, sondern eher... zusammengefrickelt. Das ist ein stinknormales phpBB Forum und das ist in dem Fall möglicherweise überfordert, wenn Du eine Seite ewig offen lässt. Das zu ändern, ist eine Baustelle, die irgendwann, in sehr ferner Zukunft in der Prioritätenliste auf einen relevanten Platz rutscht. Vorher haben wir noch ein, zwei andere Dinge zu tun. ;-)
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

nufan
Wiki-Moderator
Beiträge: 2557
Registriert: Sa Jul 05, 2008 3:21 pm

Re: Zufallsgenerator in C für 0-2

Beitrag von nufan » Di Jan 12, 2021 8:24 am

Digitalsheep hat geschrieben:
Sa Jan 09, 2021 10:53 pm
1. bei unbetrag eine Zahl zwischen -9 und +9
[...]

Code: Alles auswählen

		unbetrag = (rand()%10);
Ich kann nicht erkennen, wo genau du die negativen Zahlen erzeugst. rand() gibt eine positive Zahl zurück:
https://www.proggen.org/doku.php?id=c:lib:stdlib:rand
Der Modulo-Operator schränkt nur den Werte-Bereich ein.

Digitalsheep
Beiträge: 8
Registriert: Sa Jan 09, 2021 10:36 pm

Re: Zufallsgenerator in C für 0-2

Beitrag von Digitalsheep » Di Jan 12, 2021 10:42 pm

Komme leider erst jetz dazu mich weiter zu befassen... aber zunächst einmal:
Seit mehreren Tagen kann ich die HP von mingw nicht erreichen.
Habe eine Installation über Heise versucht aber bei den Basispaketen hat er sich eine kleine Ewigkeit genommen,
auch für Dateien, die nur wenige KB groß waren: Das kam mir nicht koscher vor, deshalb hab ich abgebrochen.
Momentan nutze ich OnlineGDB aber ne lokale Installation wäre natürlich was feines
Dont blame the code, blame the compiler!

nufan
Wiki-Moderator
Beiträge: 2557
Registriert: Sa Jul 05, 2008 3:21 pm

Re: Zufallsgenerator in C für 0-2

Beitrag von nufan » Mi Jan 13, 2021 7:36 am

Alternativ könntest du z.B. WSL verwenden.

Digitalsheep
Beiträge: 8
Registriert: Sa Jan 09, 2021 10:36 pm

Re: Zufallsgenerator in C für 0-2

Beitrag von Digitalsheep » Fr Jan 15, 2021 11:18 pm

Juhu... der Compiler funktioniert jetzt,
zumindest grüßt mein Computer die Welt!

Habe jetzt Code::Blocks mit mingw-w64 installiert.

So wie ich das verstanden habe, hat sich mingw-w64 irgendwann verselbstständigt und eigenständig weiterentwickelt. Das ursprüngliche mingw hat wohl irgendwann den Faden verloren und den Vertrieb nun ganz eingestellt. Wäre cool wenn ihr das updated im Tutorial.

Keine Ahnung wie das bei mingw gewesen ist, aber die Installation von mingw-w64 erfragte folgende Informationen:
1.Version... 8.1.0 ist die aktuellste (15.01.2021)
2.Architecture: i686 oder x86_64
3. Threads: posix oder win32
4. Exception: Je nach Architecture: dwarf oder sjlj(i686) oder seh vs. sjlj (x86_64) // wobei default der jeweils erstgenannte Option gekastet ist
5. Build revision: Bei mir gibts da nur 0 zu Wahl, zumindest bei der aktuellsten Version 8.1.0.0

Hab tatsächlich jeden Begriff nachgeschalgen und für meine Windows10-Basis dann immer noch etwas unsicher x86_64 gewählt, win32 und seh.

Unklar war auch das Pathen in Code::Blocks um mingw_w64 einzubinden. Als Standardpfad schlägt es ja einen Ordner im Stammverzeichnis C namens mingw vor.
mingw_64 hat selber jedoch folgenden Pfad zur Installation bei mir vorgeschlagen: C:\Program Files\mingw-w64
Und obwohl die automatische Erkennung von Code::Blocks auch beim folgenden Pfad zur Einbindung abstreitet die notwendigen Daten zu finden, funktioniert es zumindes jetzt mit Hello World
C:\Program Files\mingw-w64\x86_64-8.1.0-win32-seh-rt_v6-rev0\mingw64

@nufan: Gerne befasse ich mich zu einem späteren Zeitpunkt mit Linux in einer vollen Installation, allerdings will ich mich jetzt auf C fokussieren und dann auf C++
Könnt ihr mir eine anfängerfreundliche Version empfehlen um sie vom Stick laufen zu lassen? Arch Linux erscheint mir da sehr aufwändig für den Einstieg

@moderator: soll ich diesen Beitrag, da er sich ja jetzt vom ursprünglichen Thema abgespalten hat eventuell in ein neues Thema schieben?
Dont blame the code, blame the compiler!

Digitalsheep
Beiträge: 8
Registriert: Sa Jan 09, 2021 10:36 pm

Re: Zufallsgenerator in C für 0-2

Beitrag von Digitalsheep » Sa Jan 16, 2021 12:59 am

Zurück zum Thema Zufallszahlen:

Folgende Seite sagt Folgendes: https://www.c-howto.de/tutorial/uebungen/teil-1/

"... deshalb muss auch die time.h eingebunden werden. Folgende Zeilen erstellen zwei Zufallszahlen zwischen -1 und 10 (also von 0-9)."

srand(time(NULL));
int zahl1 = rand() % 10;
int zahl2 = rand() % 10;

Mich hat die die Angabe -1 und 10 irritiert und irgendwann bin ich davon ausgegangen, dass der Autor wahrscheinlich eine null unterschlagen hat.
Also -10 bis 10
Ferner kann ich den Schluss dass sich aus -1 bis 10 also 0-9 ergibt nicht nachvollziehen. 1 bis 10 als 0-9 zu verstehen wäre nicht ein Problem
Dont blame the code, blame the compiler!

Digitalsheep
Beiträge: 8
Registriert: Sa Jan 09, 2021 10:36 pm

Re: Zufallsgenerator in C für 0-2

Beitrag von Digitalsheep » Sa Jan 16, 2021 3:05 am

Mittlerweile teste ich bei srand(time(0))

x= rand(%10),
y = rand(x%3) //und wiederum ein direktes
z = rand(%3)

in jeweils 2k Fällen.
Ziel ist es herauszufinden, ob es tatsächlich eine Gewichtung gibt.

Zur statistischen Erfassung versuche ich verschiedene Konstrukte.
z.b. möchte ich erfassen wie oft X verschiedene Werte{0-9} annimmt
...
int x
int xi[10] // Variablen global
...
switch(x){ //switch nach ermittlung x,y,z
case x:{ xi[x] +1;
}
}
...

funktioniert leider nicht.
Habt ihr einen Tip?
Also eine Möglichkeit einen dynamisches Case statt n cases zu definieren, und ob es einen Weg gibt den Indize eines Arrays auch variabel zu gestalten?

Auch folgende Switchkonstruktion liefert nur Müll:

int xi[10] //global
...
switch(x){
case 0:{xi[1]++;}
case 1:{xi[2]++;}
case 2:{xi[3]++;}
case 3:{xi[4]++;}
case 4:{xi[5]++;}
case 5:{xi[6]++;}
case 6:{xi[7]++;}
case 7:{xi[8]++;}
case 8:{xi[9]++;}
case 9:{xi[10]++;}
...
printf("Werte von X: %d[0] %d[1] %d[2] %d[3] %d[4] %d[5] %d[6] %d[7] %d[8] %d[9] ",xi[1],xi[2],xi[3],xi[4],xi[5],xi[6],xi[7],xi[8],xi[9],xi[10]);
...
Datenmüll.PNG
Zumindest kann man sich über die Häufigkeit von x=3 freuen. Bleibt in jedem Durchlauf konstant bei sinnigen 42...
@moderator: Wie markiere ich selber einen Codeblock im Forumsbeitrag? HTML-Tag?
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Dont blame the code, blame the compiler!

Antworten