Groups | Search | Server Info | Keyboard shortcuts | Login | Register
Groups > de.sci.electronics > #353467
| From | Carla Schneider <carla_schn@proton.me> |
|---|---|
| Newsgroups | de.sci.electronics |
| Subject | Re: random Statistik |
| Date | 2024-06-17 12:10 +0200 |
| Organization | Mausgrau |
| Message-ID | <66700BA8.4C2E8109@proton.me> (permalink) |
| References | (11 earlier) <v4ih47$1lge3$1@solani.org> <666D7563.3B0069E4@proton.me> <v4k3ru$1me5m$1@solani.org> <666EADAE.44F26696@proton.me> <v4njn7$1oabj$1@solani.org> |
Helmut Schellong wrote:
>
> Carla Schneider wrote:
> > Helmut Schellong wrote:
> >>
> >> Carla Schneider wrote:
> >>> Helmut Schellong wrote:
> >>>>
> >>>> Carla Schneider wrote:
> >>>>> Helmut Schellong wrote:
> >>>>
> >>> -------
> >>> Dauert also kaum laenger als mit der rand() Funktion.
> >>> Aber die Differenzen sind viel groesser sie bleiben bei etwa 1% der Anzahlen
> >>> muessten aber hier um den Faktor 100 kleiner sein als bei 1Mio counts,
> >>> also 0.01% .
> >>>
> >>>
> >>> Irgendwie taugt dieser Zufallsgenerator nicht, oder da ist ein Fehler in der
> >>> Implementierung durch Chatgpt.
> >>
> >> Ich schätze, der Generator taugt nicht.
> >> -------------------------------------------------------------
> >> seed.pid= getpid();
> >> seed.tim= time(NULL);
> >> if (b!=3) i-=w;
> >> w= wv[(ulong)seed.tim%sizeof(wv)];
> >> for (a=0; a<256; ++a) {
> >> i= i+w;
> >> j= k+s[j+s[i]&255];
> >> k= i+k+s[j] + ((byte*)&seed)[a];
> >> t= s[i], s[i]=s[j], s[j]=t;
> >> z= s[j+s[i+s[z+k&255]&255]&255];
> >> }
> >> for (j=i,a=0; a<1024; ++a) {
> >> i= i+w;
> >> j= k+s[j+s[i]&255];
> >> k= i+k+s[j];
> >> t= s[i], s[i]=s[j], s[j]=t;
> >> z= s[j+s[i+s[z+k&255]&255]&255];
> >> }
> >> cnt=1600000; f=b; continue;
> >> -------------------------------------------------------------
> >> Ich verwende jedenfalls den original 'Spritz'.
> >> Die Variablen k, w, wv gibt es im RC4 nicht.
> >> Die Änderung gegenüber RC4 ist folglich groß.
> >
> > Immerhin ist das ganze doch ein schoenes Beispiel dafuer dass Fehler wie du
> > sie finden wolltest auftreten koennen.
>
> Ja.
> Ich habe Spritz vor Jahren mit der NIST-Testsuite getestet, mit positivem Ergebnis.
> Die verwendet 15 mathematische Verfahren, um Folgen von Zufallszahlen zu testen.
> Die Chi-square-Methode ist eine davon.
> Mein random-Skript ist eine simple und daher schnell handhabbare Ergänzung.
>
> > Komischerweise verschwindet der Fehler wenn ich rand_byte als integer definiere:
> > -----
> > unsigned int rand_byte;
> > rc4_spritz_generate(&rc4, &rand_byte, 4);
> > ------
>
> Das ist hochgradig seltsam.
> Du läßt so 4 statt 1 Byte in rand_byte speichern, und die drei oberen Byte werden verworfen.
> Es wurde also nichts geändert, außer jeweils mehr Aufrufe von rc4_spritz_next().
> Wenn diese Maßnahme irgend etwas repariert, so liegt fehlerhafte Programmierung vor.
>
> Es gibt auch keine Leerrunden nach Initialisierung.
> Außerdem liegt ein Etikettenschwindel vor:
> Es handelt sich nicht um den Spritz-Algorithmus.
>
> >>>> Ich sehe keinen Sinn darin, mehr als 100000 random-Zahlen zu untersuchen.
> >>>> Eigentlich reicht eine Generierung von 10000 Zahlen, um die Qualität zu beurteilen.
> >>>
> >>> Je mehr Zahlen man hat umso kleinere Abweichungen kann man finden, sieht man ja
> >>> an dem Experiment oben.
> >>
> >> Die Abweichungen verschwinden jedoch nicht - jedenfalls nicht mit 6 Nachkommastellen.
> >
> > Das ist eine Frage der Menge der Zufallszahlen und der Zahl der Nachkommastellen die du
> > angucken willst.
> >
> >> Und sie haben stets den gleichen Charakter im Verlauf.
> >> Folglich sind (viel) mehr random-Zahlen irrelevant.
> >
> > Wenn die Zufallszahlen gut sind, wird das Pendeln um den Mittelwert
> > bei 100 facher Anzahl um den Faktor 10 kleiner, also um eine Nachkommastelle.
> > Um das zu sehen muss man natuerlich 100 und 10000 mehr Zufallszahlen nehmen koennen.
> >
> >>
> >> Ich schrieb bereits in [08.06.2024, 15:32] vom Pendeln um den Mittelwert.
> >
> > Das entspricht einem eindimensionalen
> > https://en.wikipedia.org/wiki/Random_walk
>
> Wird wohl so sein.
> Jedenfalls nehmen die Frequenz und die Amplitude des Pendelns fortlaufend ab.
Eigentlich nimmt die absolute Amplitude zu mit Wurzel(Anzahl).
Was abnimmt ist die relative Amplitude als Wurzel(Anzahl)/Anzahl.
> Sie werden erst im Unendlichen 0.
Die absolute Amplitude wird auch im Unendlichen Unendlich...
> Genau deshalb wird die Anzahl der Zufallszahlen irgendwann extrapolierend irrelevant.
>
> >>>> Genau deshalb habe ich _meine_ Shell, nicht jedoch C, als Werkzeug gewählt.
> >>>
> >>>
> >>> Damit es dich daran hindert mehr Zahlen auszuprobieren ?
> >>
> >> Zu Anfang hatte ich 10 Mio. Zahlen innerhalb von etwa 15 s fertig.
> >> Das war voll auskömmlich schnell.
> >
> > Die Ausgabe der Zeile fuer jedes mal wuerfeln macht den groessten Aufwand.
>
> Ja, jedenfalls ist die Ausgabe auf den Bildschirm sehr langsam.
> Bei Umlenkung rand.bish > random.out ist es vielleicht 20-fach schneller.
>
> > Wenn ich die Zufallszahlen in ein File schreiben wollte damit andere
> > sie testen koennen wuerde ich das in binaerer Form tun, also 3 bit pro Zahl (von 1-6),
> > das koennte man in 10 Zahlen pro 4 Byte tun. Dann wuerden 10Mio Zahlen 4Mbyte brauchen.
> > Man koennt auch die Bytes des SPRITZ Algorithmus so ausgeben, das waere dann 1 Byte pro Zahl.
> >
> > In C koennte man das einfach tun, mit fopen,fwrite,fclose, aber ginge das auch in deinem
> > shell-script ?
> > Ich meine jetzt nicht dass du das machen sollst, sondern es geht mir nur um die
> > Praktikabilitaet soetwas als Shellscript zu programmieren.
>
> Ja, das wird nur mit meiner Shell bish funktionieren.
> http://www.schellong.de/htm/bishmnk.htm#bishK
> Die bish ist komplett binär.
> Variablen können alle Byte-Werte von 0..255 enthalten, >300 Mio. davon, falls erforderlich.
> Dateien werden geöffnet per > < >> und geschlossen per ><<< .
>
> catv [quelle(n) ...] [=ziel]
> [[offset,]max,]objekt ... objekt: name|handle
> [:+-][offset][:+-]
> [:.]objekt[:.]
> /konstante
> /abc%x%255xyz
> .konstante
> , ,. ,r
> Vorstehendes Kommando kann Dateien und Variablen lesen und schreiben
> und Konstanten lesen und konvertieren.
> Es können beliebig viele Variablen und Dateien, mit jeweils Offset und Anzahl Byte, und Konstanten
> gemischt verkettet in ein beliebiges Ziel ebenfalls mit Offset und Anzahl geschrieben werden.
Er muesste also die Zahlen die bei dir ja Dezimalszahlen als Strings sind,
erst mal in Binaerzahlen als Bytes umwandeln und die dann in eine Datei schreiben...
>
> Mittels set sa:025 wird die Variable sa erzeugt und mit 25 Ziffern '0' initialisiert.
> Mittels set sa:.25 wird die Variable sa erzeugt und mit 25 Zeichen '.' initialisiert.
> Mittels set sa:46.25 wird die Variable sa erzeugt und mit 25 Zeichen '.' initialisiert.
> Mittels set sa:0.25000000 wird die Variable sa erzeugt und mit 25 Mio. 0-Byte initialisiert.
sa ist also eigentlich ein string, das ist fuer eine shell-Varible auch vernuenftig weil
es der normale Einsatzzweck ist, z.B. der Library search path...
Zum Rechnen ist es eher unguenstig, weil bei jeder Rechnung die Strings erst mal in
Zahlen konvertiert werden muessen, und danach wieder zurueck in Strings.
> >> Nachdem das Skript stark erweitert wurde, sind 10 Mio. unbequem geworden.
> >> Aber 1 Mio. ist immer noch /locker/.
> >> 1 Mio. lasse ich aber ohnehin nur noch selten laufen.
> >>
> >> Laß doch mal das aktuelle Skript in C übersetzen.
> >> Wegen der neuen Zahlenfolgen.
> >
> >
> > Diesmal gibts Fehler beim Kompilieren, durch sich widersprechende doppelte Definitionen
> > von Variablen:
> >
> >
> > ----------------
> > #include <stdio.h>
> > #include <stdlib.h>
> > #include <time.h>
> > #include <math.h>
> >
> > #define NUM_ROLLS 100000
> >
> > int main() {
> > long double ARITH_FMT = 0.000001;
> > int r = 0, r0 = 0, z = 0, n = 0, e = 0, s = 0, m = 0, m0 = 0;
> > int sa = 0, dp = 0, dm = 0, d0 = 0, c61 = 0, c16 = 0, c22 = 0;
> > int Z[7] = {0}; // We use indices 1 to 6 for convenience
> > long long s = 0, skip = 0, i = 0;
> > long double m = 0.0, sa = 0.0;
> >
> > srand(time(NULL));
> >
> > printf("Anzahl Zufallszahl SummeZ Mittelwert Abweichungen\n");
> >
> > for (n = 1; n <= NUM_ROLLS; n++) {
> > r = (rand() % 6) + 1;
> > int d = r - r0;
> > if (d >= 0) {
> > dp += d;
> > } else {
> > dm -= d;
> > }
> > if (skip == 0) {
> > if (r0 == 6 && r == 1) {
> > c61++;
> > skip = 1;
> > } else if (r0 == 1 && r == 6) {
> > c16++;
> > skip = 1;
> > } else if (r0 == 2 && r == 2) {
> > c22++;
> > skip = 1;
> > }
> > } else {
> > skip = 0;
> > }
> >
> > s += r;
> > m = (long double) s / n;
> > sa += m - 3.5;
> > Z[r]++;
> > if (d == 0) {
> > d0++;
> > }
> > r0 = r;
> >
> > printf("%d %d %lld %.6Lf %lld\n", n, r, s, m, llround(sa));
> > }
> >
> > r = (NUM_ROLLS - 1) / 6;
> > printf("%d %d %d %d %d %d Anzahlen von 1 2 3 4 5 6\n", Z[1], Z[2], Z[3], Z[4], Z[5], Z[6]);
> > printf("%d %d %d %d %d %d %% Differenzen zum Erwartungswert\n", Z[1] - r, Z[2] - r, Z[3] - r,
> > Z[4] - r, Z[5] - r, Z[6] - r);
> > printf("%d %d %d Summen der pos. und neg. Differenzen und Gleichheiten Z-Z0\n", dp, dm, d0);
> > printf("%d %d %d Anzahlen der Zahlenfolgen 61, 16, 22\n", c61, c16, c22);
> >
> > return 0;
> > }
> > -----------
> >
> > -------
> > nscript.c:13:15: error: conflicting types for 's'; have 'long long int'
> > 13 | long long s = 0, skip = 0, i = 0;
> > | ^
> > nscript.c:10:45: note: previous definition of 's' with type 'int'
> > 10 | int r = 0, r0 = 0, z = 0, n = 0, e = 0, s = 0, m = 0, m0 = 0;
> > | ^
> > nscript.c:14:17: error: conflicting types for 'm'; have 'long double'
> > 14 | long double m = 0.0, sa = 0.0;
> > | ^
> > nscript.c:10:52: note: previous definition of 'm' with type 'int'
> > 10 | int r = 0, r0 = 0, z = 0, n = 0, e = 0, s = 0, m = 0, m0 = 0;
> > | ^
> > nscript.c:14:26: error: conflicting types for 'sa'; have 'long double'
> > 14 | long double m = 0.0, sa = 0.0;
> > | ^~
> > nscript.c:11:9: note: previous definition of 'sa' with type 'int'
> > 11 | int sa = 0, dp = 0, dm = 0, d0 = 0, c61 = 0, c16 = 0, c22 = 0;
> > --------
> >
> > Er interpretiert set sa:025 dass sa eine oktalzahl zugewiesen wird
> > und damit sa als integer. Ein paar Zeilen spaeter wird sa dann 0.0 zugewiesen
> > womit sa eine floatingpoint zahl sein soll...
>
> Variablen in einer Shell haben keinen Typ.
Haette ja sein koennen dass das bei deiner Shell anders ist.
> Standardmäßig enthalten sie Zeichenketten.
> sa:025 erzeugt Variable sa und initialisiert mit 25 '0'-Ziffern.
> Danach wird 0.0 zugewiesen, um ihr den Gleitkommatyp zuzuordnen.
> Nach 0.0 sind nur die 3 Zeichen 0.0 enthalten, jedoch 22 weitere Byte reserviert.
D.h. es ist eigentlich ein String der Laenge 22 in dem "0.0" steht.
In C dagegen macht chatgtp daraus eine "long double" .
Auf einem Intel oder Amd PC ist das eine 10byte floating-point Zahl,
mit 63 bit Fraction und 15 Bit exponent,das groesste was es auf diesen Prozessoren gibt.
Back to de.sci.electronics | Previous | Next — Previous in thread | Next in thread | Find similar
Re: random Statistik Carla Schneider <carla_schn@proton.me> - 2024-06-10 11:24 +0200
Re: random Statistik Helmut Schellong <var@schellong.biz> - 2024-06-10 17:05 +0200
Re: random Statistik Carla Schneider <carla_schn@proton.me> - 2024-06-11 11:48 +0200
Re: random Statistik Carla Schneider <carla_schn@proton.me> - 2024-06-11 13:00 +0200
Re: random Statistik Helmut Schellong <var@schellong.biz> - 2024-06-11 15:50 +0200
Re: random Statistik Carla Schneider <carla_schn@proton.me> - 2024-06-11 16:26 +0200
Re: random Statistik Helmut Schellong <var@schellong.biz> - 2024-06-11 17:51 +0200
Re: random Statistik Rolf Bombach <rolfnospambombach@invalid.invalid> - 2024-06-11 14:31 +0200
Re: random Statistik Helmut Schellong <var@schellong.biz> - 2024-06-11 15:45 +0200
Re: random Statistik Helmut Schellong <var@schellong.biz> - 2024-06-12 05:04 +0200
Re: random Statistik Carla Schneider <carla_schn@proton.me> - 2024-06-12 08:43 +0200
Re: random Statistik Helmut Schellong <var@schellong.biz> - 2024-06-12 16:36 +0200
Re: random Statistik Helmut Schellong <var@schellong.biz> - 2024-06-12 21:41 +0200
Re: random Statistik Helmut Schellong <var@schellong.biz> - 2024-06-13 21:01 +0200
Re: random Statistik Helmut Schellong <var@schellong.biz> - 2024-06-14 10:13 +0200
Re: random Statistik Carla Schneider <carla_schn@proton.me> - 2024-06-14 12:36 +0200
Re: random Statistik Helmut Schellong <var@schellong.biz> - 2024-06-15 00:44 +0200
Re: random Statistik Carla Schneider <carla_schn@proton.me> - 2024-06-15 13:05 +0200
Re: random Statistik Helmut Schellong <var@schellong.biz> - 2024-06-15 15:10 +0200
Re: random Statistik Carla Schneider <carla_schn@proton.me> - 2024-06-16 11:17 +0200
Re: random Statistik Helmut Schellong <var@schellong.biz> - 2024-06-16 22:59 +0200
Re: random Statistik Carla Schneider <carla_schn@proton.me> - 2024-06-17 12:10 +0200
Re: random Statistik Helmut Schellong <var@schellong.biz> - 2024-06-17 15:05 +0200
Re: random Statistik Rolf Bombach <rolfnospambombach@invalid.invalid> - 2024-06-15 20:34 +0200
Re: random Statistik Helmut Schellong <var@schellong.biz> - 2024-06-15 23:12 +0200
Re: random Statistik Rolf Bombach <rolfnospambombach@invalid.invalid> - 2024-06-17 15:16 +0200
Re: random Statistik Helmut Schellong <var@schellong.biz> - 2024-06-17 16:40 +0200
Re: random Statistik - Windows PowerShell Helmut Schellong <var@schellong.biz> - 2024-06-18 00:17 +0200
Re: random Statistik Carla Schneider <carla_schn@proton.me> - 2024-06-13 09:43 +0200
Re: random Statistik Helmut Schellong <var@schellong.biz> - 2024-06-13 12:55 +0200
Re: random Statistik Carla Schneider <carla_schn@proton.me> - 2024-06-13 14:05 +0200
Re: random Statistik Helmut Schellong <var@schellong.biz> - 2024-06-13 16:11 +0200
Re: random Statistik Carla Schneider <carla_schn@proton.me> - 2024-06-13 16:57 +0200
Re: random Statistik Helmut Schellong <var@schellong.biz> - 2024-06-13 20:47 +0200
Re: random Statistik Carla Schneider <carla_schn@proton.me> - 2024-06-18 10:59 +0200
Re: random Statistik Helmut Schellong <var@schellong.biz> - 2024-06-18 17:37 +0200
csiph-web