Mondphasen und Pilzwachstum

Überblick

In einer Arbeit von Ursula und Fritz Hirschmann [HH] wird, nach Selbsteinschätzung der Autoren, der empirische Nachweis eines Zusammenhangs zwischen den Mondphasen und dem Wachstum von Pilzen geleistet. Als Grundlage dienen dabei die archivierten N=1766 Protokolle einer Pilzberatungsstelle aus den Jahren 1967 bis 1998. Es wird davon ausgegangen, daß ein erhöhtes Pilzvorkommen auch mit einer höheren Anzahl von Pilzberatungen korreliert, somit die Verteilung der Beratungsprotokolle auf die Mondphasen ein Mittel ist, um einen Zusammenhang der Mondphasen mit dem Pilzwachstum zu erkennen.

In der Arbeit [HH] wurden keine Hypothesen vor der Durchführung des Versuchs festgelegt. Die Autoren leiteten vielmehr aus der Analyse der Daten erst ihre Aussagen ab. Dagegen ist im Prinzip nichts einzuwenden - nur handelt es sich dann nicht um den Nachweis eines Effekts, sondern um die Vorermittlung eines Zusammenhangs, dessen Nachweis durch eine Wiederholungsstudie möglicherweise interessant sein könnte.

Als ein Maß, wie lohnend derartige Replikationsstudien sein könnten, kann der Vergleich mit dem Zufall dienen. Ist das Ergebnis "signifikant", d.h.: Heben sich die Aussagen über den Zusammenhang mit Mondphasen hinreichend deutlich von zufällig gezogenen "Beratungsterminen" ab, die sich über den Beobachtungszeitraum ungefähr gleich verteilen wie der Originaldatensatz?

Diesen Fragen ging Volker Guiard in seiner Arbeit [VG] nach. Der vorliegende Artikel versteht sich als eine Ergänzung zu dieser Arbeit unter Verwendung einer anderen Methode.

Hirschmann und Hirschmann schreiben: "Der Kurvenverlauf ist eindeutig. Die Abhängigkeit von den Mondphasen ist gegeben. Das Maximum liegt hier etwa 8 Tage vor Vollmond, das Minimum etwa sieben Tage nach Vollmond." Hieraus könnte man zwei zu prüfende Hypothesen entnehmen:

(Woraus sich entsprechende Rückschlüsse von den Mondphasen auf das Pilzwachstum ergäben.)

Wie liesse sich messen, ob eine Zufallsprobe einen ebenso deutlichen oder gar noch deutlicheren Zusammenhang aufweist? Antwort:

Dies sind klar formulierte Kriterien, die sich in Anweisungen eines Programms formulieren lassen.

Definition der Samples

Es soll ein Generator geschrieben werden, der N=1766 (Pseudo-)Zufallsdaten mit den folgenden Vorgaben erzeugt:

Durchführung

Man kann (Pseudo-)Zufallsdaten mit diesen Häufigkeiten wie folgt erzeugen:

Man erzeugt nicht N=1766, sondern N=7*382 zufällig verteilte Daten. Die Liste wird in sieben Unterlisten nach den Wochentagen zerlegt. Nun werden aus der Liste der Sonntage Null Tage herausgenommen, aus der Liste der Montage 382-281 = 101 Elemente, etc. Welche Elemente herauszunehmen sind, wird wiederum durch Zufallsgeneratoren ermittelt. Im Ergebnis erhält man 1766 zufällige Daten, die ungefähr so wie die Vorgabe auf die Wochentage verteilt sind.

Um auch die Verteilung auf die Monate zu erreichen, startet man mit einer noch größeren Datenmenge, nämlich N = 7*382*( 4*749 / 1766 ) Daten. Die Daten werden in vier Listen nach den Monaten zerlegt. Aus den auf den Juli entfallenden Daten entfernt man nach dem Zufallsprinzip 7*382*(749-230)/1766 Daten, usf. für August und Oktober. Der verbleibende Satz von 7*382 Daten wie wird oben beschrieben hinsichtlich der Wochentage bearbeitet. Man verbleibt mit 1766 zufälligen Daten, die wie vorgegeben auf Wochentage und Monate verteilt sind.

Schließlich kann man auch der Ungleichverteilung der Protokolle auf die Jahre gerecht werden, indem man als Ausgangsmenge für die beschriebenen Ausdünnungen im Jahr x eine Anzahl von N * r(x) Daten erzeugt, wobei r(x) die relative Häufigkeit von Protokollen im Jahre x bedeutet. Da man nur ganzzahlige Datenmengen erzeugen kann, entstehen hierbei kleine Fehler in der Gesamtzahl, die am Ende wieder durch Hinzufügen weiterer Zufallsdaten zu korrigieren sind.

Die Winkelabstände zwischen Sonne und Mond werden, beginnend mit dem Neumond, in 30 "Phasentage" a 12 Grad geteilt. Für jedes Sample wird die Verteilung der Daten auf die 30 Phasentage ermittelt. An die so erhaltenen Anzahlen werden Korrekturfaktoren angebracht, die aus der Ungleichverteilung der Phasentage über den Untersuchungszeitraum resultieren. Die gleichen Faktoren werden auch an die Originalprobe von Hirschmann und Hirschmann angebracht. Statt der Messgröße "Anzahl von Beratungen pro Phasentag" werden wir nach Anbringung dieses Normierungsfaktors von der "normierten Anzahl von Beratungen je Phasentag" sprechen.

Diese Daten werden nun in ein Mathematica Notebook eingelesen. Es wird jeweils ein Least Squares Fit mit einem sinusförmig von den Mondphasen abhängenden Lauf geschätzt und die resultierende mittlere quadratische Abweichung berechnet. Außerdem wird abgezählt, wieviele Daten auf zunehmenden Mond, also auf die Phasentage 0 bis 14 fallen. Schließlich wird abgezählt, in wievielen Samples eine bessere quadratische Abweichung als bei Hirschmann und Hirschmann erzielt wird, und in wie vielen Samples mindestens ebenso viele Daten auf den zunehmendem Mond fielen wie bei Hirschmann und Hirschmann Beratungen.

Ergebnisse von Hirschmann und Hirschmann

Tabelle 3
Normierte Beratungszahl
je Phasentag
 1:  57.0868
 2:  42.7393
 3:  49.9807
 4:  66.6095
 5:  57.6483
 6:  60.2550
 7:  63.1706
 8:  68.4938
 9:  74.2820
10:  68.6279
11:  56.3750
12:  71.1939
13:  55.1871
14:  62.6180
15:  79.5802
16:  65.0990
17:  53.6726
18:  43.7333
19:  41.0624
20:  70.1769
21:  49.9344
22:  60.7046
23:  71.3879
24:  46.5855
25:  53.0807
26:  62.1987
27:  47.3504
28:  52.0633
29:  48.8408
30:  66.6410
Mathematica Notebook mit allen Rechnungen zum Download (ZIP, 66KB)
Die links stehende Tabelle enthält die relevanten Daten, die sich aus der Erhebung von Hirschmann und Hirschmann ergeben: Die normierte Anzahl von Beratungen je Phasentag. Diese gilt es zu analysieren. Die Zahlen haben sich - im Vergleich zu den von [HH] verwendeten - durch die Normierung an manchen Stellen deutlich verändert. Der Höhepunkt um den 8. Phasentag verliert durch die Normierung deutlich an Gewicht, während das "Zwischenhoch" zum Vollmond nun den Höchstwert annimmt. Diese Verschiebungen ändern jedoch nichts an der Gestalt der Glättungskurve, die einen Berg in der ersten und ein Tal in der zweiten Hälfte des Mondlaufs ergibt. Dieser Trend ist bereits deutlich bei der Zwei-Tage-Glättung ersichtlich, und nicht bloß bei der von [HH] herangezogenen Sieben-Tage-Glättung.

In den folgenden Abbildungen habe ich die unnormierten Daten nach [HH] zusammen mit ihrer Zwei-Tage-Glättung dargestellt (in der also jeder Funktionswert der Mittelwert aus fünf Säulenhöhen des Balkendiagramms ist). Die normierten Daten wurden zusammen mit ihrer Regressionskurve nach dem Modell

f(x) = a sin( Pi x/15 + b) + c
dargestellt. Es wurde also ein sinusförmiger Verlauf mit den Mondphasen angesetzt. Die Regressionskurve bestätigt: der Berg liegt in der ersten, das Tal in der zweiten Hälfte. Insbesondere legt das Datenmaterial also die Aussage nahe, daß bei zunehmendem Mond ein stärkeres Pilzwachstum zu erwarten ist als bei abnehmendem. Denn bei zunehmendem Mond fanden rund 934, bei abnehmendem Mond nur rund 832 Beratungen statt. Eine erste grobe Abschätzung der Signifikanz dieses Unterschieds anhand der Binomialverteilung mit p = 1/2 ergibt eine recht hohe Signifikanz (Wahrscheinlichkeit 0.82%). Einen genaueren Wert für die Signifikanz erhält man mit Hilfe der Zufallsproben (s.u.).
Abb. 1: Häufigkeiten nach [HH]
mit 2-Tage-Glättung
Abb. 2: Normierte Häufigkeiten
mit Regressionskurve

Vergleich mit Zufallsproben

Das Ergebnis der Berechnungen ist in der folgenden Tabelle enthalten.

Ergebnis der Auswertungen
Number of Samples 1000
Hirschmann/Hirschmann Residual Sum of Squares (RSSHH) 2431.22
Number of Samples with RSS < RSSHH 918
Consultations at Moon Wax for Hirschmann/Hirschmann 933.848
Number of samples with WaxSum < WaxSumHH 983

Hieraus ist zu entnehmen:

Anhand dieses Ergebnisses bin ich geneigt, den sinusförmigen Zusammenhang für ein Zufallsprodukt zu halten, während die Aussage, daß mehr Beratungen auf zunehmenden Mond fallen, erfolgversprechender aussieht. Es könnte möglicherweise lohnend sein, eine Überprüfung dieser zweiten Aussage mit unabhängigem Datenmaterial vozunehmen.

Anhang

Referenz

[HH] Ursula und Fritz Hirschmann: Unser Mond und sein Einfluß auf das Pilzwachstum - Lassen sich Zusammenhänge nachweisen?, Natur und Mensch, Jahresmitteilungen der Naturhistorischen Gesellschaft Nürnberg e.V., 1999, S. 79-82.
[VG] Volker Guiard: Auswertung einer Datenerhebung bezüglich des Mondeinflusses auf das Pilzwachstum, zu erscheinen in Nr. 3/2002 der Zeitschrift für Anomalistik

Mathematica Notebook für die statistische Auswertung
(* Load random samples *)
pd = ReadList["Sample.txt", Table[Number,{i,1,30}]];
(* Load Hirschmann/Hirschmann dataset *)
Print["Number of Samples : ", Length[pd]];
hh = ReadList["B_PT.txt", Number];
(* Compute Residual Sum of Squares for HH *)
<< Statistics`NonlinearFit`
f = NonlinearFit[Table[{i,hh[[i]]},{i,1,30}],
                                    a  Sin[ Pi x / 15 + b ] + c,
                                    {x},
                                     {a,b,c}];
RSSHH = Sum[(hh[[i]]-f/.x->i)^2, {i,1,30}];
Print["Hirschmann/Hirschmann RSS : ", RSSHH];
(* Now compute the RSS for the samples *)
RSS = Table[0,{i,1,Length[pd]}];
For[j=1, j <= Length[pd], j++,
f = NonlinearFit[Table[{i,pd[[j]][[i]]},{i,1,30}],
                                    a  Sin[ Pi x / 15 + b ] + c,
                                    {x},
                                     {a,b,c}];
RSS[[j]] = Sum[ (pd[[j]][[i]]-f/.x->i)^2, {i,1,30}]
                                    ];
RSS = Sort[RSS];
For[ i=1, ( RSS[[i]] < RSSHH  ) && ( i < Length[pd] ), i++];
Print["Number of Samples with RSS < RSSHH : ", i];

(* The waxing/waning moon hypothesis *)
WaxSumHH = Sum[hh[[j]],{j,1,15}];
Print["Consultations at Moon Wax for Hirschmann/Hirschmann",
        "(WaxSumHH) : ", WaxSumHH];
WaxSumSample = Sort[Table[Sum[pd[[i]][[j]],{j,1,15}],{i,1,Length[pd]}]];
For[ i=1, ( WaxSumSample[[i]] < WaxSumHH  ) && ( i < Length[pd] ), i++];
Print["Number of samples with WaxSum < WaxSumHH : ",i];

C-Quelltext für den Zufallsprobengenerator
//---------------------------------------------------------------------------
// Sample generator for the Moon-Mushroom series
//---------------------------------------------------------------------------
// Generate a series of N=1766 dates in the years 1967-1998
// within the months July-October,
// and with prescribed approximated frequencies of
// - number of dates per day of the week
// - number of dates per month
// - number of dates per year
//---------------------------------------------------------------------------

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#pragma hdrstop

#define s1(dummy) sin((dummy)*1.745329251994329576923691e-2)
#define c1(dummy) cos((dummy)*1.745329251994329576923691e-2)
#define fract(dummy) (dummy - floor(dummy))
//---------------------------------------------------------------------------
#define Pi2 6.28318530717958647692529e0
#define Conv 1.745329251994329576923691e-2


//---------------------------------------------------------------------------
// Ecliptical longitude of the sun, trig series expansion due to S. Newcomb
//---------------------------------------------------------------------------
      void newcomb (ti,x)
      double ti,*x;
      {
      double t,t1,dlp,l0,l01,g,g2,g4,g5,g6,d,a_,dl,dl2,dl4,dl5,dl6;
      double dlm,l,lx;
      t1 = ti - (double)2415020.;
      t = t1/(double)36525.;
//  --- long periodic disturbation 
      dlp = ((double)1.882e0-(double).016*t)*
          s1((double)57.24  + (double)150.27*t)
          + (double) 6.4            *s1(231.19e0 +  20.20*t)
          + (double)0.266          *s1( 31.8e0  + 119.00*t);
//  --- mean longitude sun  
      l0  = 279.6966778e0 + 360.*fract(t1/(double)365.25);
      l01 = 2768.13*t + 1.089*t*t + 0.202*s1(315.6e0+893.3*t)+dlp;
      l0  = l0 + l01/3600.e0;
//  --- mean anomaly sun 
      g   = 358.475833e0
          + 360.e0*fract(t1*(double).0027104722792607802874743)
          + t1*(double).009828884325804243668
          + ( 179.1*t - .54*t*t + dlp )/3600.e0;
//  --- mean anomaly venus,mars,jupiter,saturn 
      g2  = 212.45e0 + 360.*fract(t1*(double).004435318275154004107)
          + t1*(double).0054070636650308;
      g4  = 319.58e0 + t1*(double).524024010951403;
      g5  = 225.28e0 + t1*(double).0830823545516769336
          + (double).3611111111111111111* s1(133.775e0 + 39.804*t);
      g6  = 175.6e0  + t1*(double).03345089664613278576;
//  --- moon data 
      d   = 350.737486e0 + t1*(double).00840832900752909
          + 360.*fract(t1*(double).033839835728952772);
      a_  = 296.104608e0 + t1*(double).005444191868583162
          + 360.*fract(t1*(double).0362765229295003422);
//  --- terms of two body motion 
      dl  = (6910.057e0 - 17.240e0*t)*s1(   g )
          + (  72.338e0 -   .361e0*t)*s1(2.e0*g)
          +                1.054e0*t *s1(3.e0*g );
//  --- perturbations in longitude 
      dl2 = 4.838*c1(299.102e0 +    g2 -    g)
          + 0.116*c1(148.900e0 + 2.*g2 -    g)
          + 5.526*c1(148.313e0 + 2.*g2 - 2.*g)
          + 2.497*c1(315.943e0 + 2.*g2 - 3.*g)
          + 0.666*c1(177.710e0 + 3.*g2 - 3.*g)
          + 1.559*c1(345.243e0 + 3.*g2 - 4.*g)
          + 1.024*c1(318.150e0 + 3.*g2 - 5.*g)
          + 0.210*c1(206.200e0 + 4.*g2 - 4.*g)
          + 0.144*c1(195.400e0 + 4.*g2 - 5.*g)
          + 0.152*c1(343.800e0 + 4.*g2 - 6.*g)
          + 0.123*c1(195.300e0 + 5.*g2 - 7.*g)
          + 0.154*c1(359.600e0 + 5.*g2 - 8.*g);
//  ---  
      dl4 = 0.273*c1(217.700e0 -    g4 +    g)
          + 2.043*c1(343.888e0 - 2.*g4 + 2.*g)
          + 1.770*c1(200.402e0 - 2.*g4 +    g)
          + 0.129*c1(294.200e0 - 3.*g4 + 3.*g)
          + 0.425*c1(338.800e0 - 3.*g4 + 2.*g)
          + 0.500*c1(105.180e0 - 4.*g4 + 3.*g)
          + 0.585*c1(334.060e0 - 4.*g4 + 2.*g)
          + 0.204*c1(100.800e0 - 5.*g4 + 3.*g)
          + 0.154*c1(227.400e0 - 6.*g4 + 4.*g)
          + 0.101*c1( 96.300e0 - 6.*g4 + 3.*g)
          + 0.106*c1(222.700e0 - 7.*g4 + 4.*g);
//  ---  
      dl5 = 0.163*c1(198.600e0 -    g5 + 2.*g)
          + 7.208*c1(179.532e0 -    g5 +    g)
          + 2.600*c1(263.217e0 -    g5       )
          + 2.731*c1( 87.145e0 - 2.*g5 + 2.*g)
          + 1.610*c1(109.493e0 - 2.*g5 +    g)
          + 0.164*c1(170.500e0 - 3.*g5 + 3.*g)
          + 0.556*c1( 82.650e0 - 3.*g5 + 2.*g)
          + 0.210*c1( 98.500e0 - 3.*g5 +    g);
//  ---  
      dl6 = 0.419*c1(100.580e0 -    g6 +    g)
          + 0.320*c1(269.460e0 -    g6       )
          + 0.108*c1(290.600e0 - 2.*g6 + 2.*g)
          + 0.112*c1(293.600e0 - 2.*g6 +    g);
//  ---  
      dlm = 6.454*s1(d)
          + 0.177*s1(d+a_)
          - 0.424*s1(d-a_)
          + 0.172*s1(d-g);
// --- now sum up to true longitude 
      l = dl + dl2 + dl4 + dl5 + dl6 + dlm ;
      lx = fmod(l/.36e4 + l0,.36e3);
      *x = lx;
      }

//---------------------------------------------------------------------------
// lunar ephemerides computed to within 1' (brown/i.l.e.) 
//---------------------------------------------------------------------------
      void brown ( xjd,l)
      double  xjd,*l;
      {
      double w,xnut_,day,xl,yl,xp,yp,xn,al,bl,ap,bp,an,
      u,v,f,d,dl;
      double floor(),sin(),cos(),fmod();
      w=(xjd-2415020.e0)/36525.e0;
      xnut_ = -17.2327/1296000.*sin((259.18-1934.142*w)*Conv);
      day=xjd-2415020.e0;
      xl=.751206e0+day*.0366011014634e0;
      yl=.776935e0+day*.0027379092649e0;
      xp=.928693e0+day*.0003094557786e0;
      yp=.781169e0+day*.0000001307457e0;
      xn=.719954e0-day*.0001470942283e0;
      al=(xl-floor(xl))*Pi2;
      bl=(yl-floor(yl))*Pi2;
      ap=(xp-floor(xp))*Pi2;
      bp=(yp-floor(yp))*Pi2;
      an=(xn-floor(xn))*Pi2;
      u=al-ap;
      v=bl-bp;
      f=al-an;
      d=al-bl;
      dl=22639*sin(u)-4586*sin(u-d-d)+2370*sin(d+d)+769*sin(u+u)
      -668*sin(v)-412*sin(f+f)-212*sin(u+u-d-d)-206*sin(u+v-d-d)
      +192*sin(u+d+d)-165*sin(v-d-d)+148*sin(u-v)-125*sin(d)
      -110*sin(u+v)-55*sin(f+f-d-d)-45*sin(u+f+f)+40*sin(u-f-f)
      -38*sin(u-4*d)+36*sin(3*u)-31*sin(u+u-4*d)+28*sin(u-v-d-d)
      -24*sin(v+d+d)+19*sin(u-d)+18*sin(v+d)+15*sin(u-v+d+d)
      +14*sin(4*d)+14*sin(u+u+d+d)-13*sin(3*u-d-d);
      xl += dl/1296000.+xnut_;
      *l         =(xl-floor(xl))*360.e0;
      }

//---------------------------------------------------------------------------
// Calendar conversion civil -> julian
//---------------------------------------------------------------------------
      void date1 (int year,
                  int month,
                  int day,
                  double et,
                  double *xjd)
      {
      double y,m,b,floor();
// --- calendar date --> julian date 
      y = (double) year;
      m = (double) month;
      if (m <= 2.) {
        m = m + 12.;
        y = y - 1.;
      }
      b = floor(y/400.)- floor(y/100.);
      *xjd = floor(365.25*y) + floor(30.6001*(m+1)) + b +
      1720996.5e0 + day + et/24.;
      return;
      }


//---------------------------------------------------------------------------
// Calendar conversion julian -> civil
//---------------------------------------------------------------------------
      void date2 (year,month,day,et,xjd)
      int *year,*month,*day;
      double *et,xjd;
      {
      double a,b,c,d,e,f,floor();
// --- julian date --> calendar date  
      a = floor(xjd + .5);
      if (a < 2299161.)
       c = a + 1524.;
      else {
       b = floor((a-1867216.25)/36524.25);
       c = a + b - floor(b/4.) + 1525.;
      }
      d = floor((c-122.1)/365.25);
      e = floor(365.25*d);
      f = floor((c-e)/30.6001);
      *day = c - e - floor(30.6001*f);
      *et = (xjd + 0.5 - floor(xjd+0.5))*24.;
      *month = f - 1 - (int)(f/14)*12;
      *year = d - 4715 - (int)((7+*month)/10);
      return;
      }

//---------------------------------------------------------------------------
// Compute the moon's phase value
//---------------------------------------------------------------------------
  int phase(double juldat) {

    double ls, lm, v;

    newcomb( juldat, &ls);
    brown( juldat, &lm );
    v = (lm - ls)/360.;
    return (int) floor((v - floor(v))*30.);
  }

//---------------------------------------------------------------------------
// Get random Julian date
//---------------------------------------------------------------------------
  double randomdate() {
    int y,m,d;
    static double et = 12.e0, xjd;

// Convert random number into calendar date
    d = rand() % 3936;
    y = div(d,123).quot + 1967;
    d = div(d,123).rem + 1;
    if (d < 32) m = 7;
    else if (d < 62) { m = 8; d -= 31; }
         else if (d < 92) { m = 9; d -= 62; }
              else { m = 10; d -= 92; }

// Convert to julian day number
    date1(y,m,d,et,&xjd);

    return xjd;

    }

//---------------------------------------------------------------------------
// Get random Julian date for a single year
//---------------------------------------------------------------------------
  double randomdate_year(int year) {
    int m,d;
    static double et = 12.e0, xjd;

// Convert random number into calendar date
    d = rand() % 123 + 1;
    if (d < 32) m = 7;
    else if (d < 62) { m = 8; d -= 31; }
         else if (d < 92) { m = 9; d -= 62; }
              else { m = 10; d -= 92; }

// Convert to julian day number
    date1(year,m,d,et,&xjd);

    return xjd;

    }

//---------------------------------------------------------------------------
// Leave the program due to an error
//---------------------------------------------------------------------------
void drop_out() {
  fgetc(stdin);
  exit(EXIT_FAILURE);
}

#pragma hdrstop

//---------------------------------------------------------------------------
// Main program
//---------------------------------------------------------------------------

#pragma argsused
int main(int argc, char* argv[])
{
   int fatal = 0;
   FILE *out, *factors;
   double xjd0, et, cdpd[30], factor;
   long int n, n1;
   int i,j,k,i0,
       n0 = 0,
       iter,
       d,m,y,
       weekday_fr[7] = { 281, 169, 223, 198, 199, 314, 382 },
       month_fr[4] = { 230, 417, 749, 370 },
       year_fr[32] = { 7,9,24,49,13,24,62,93,131,81,138,62,39,
                       111,219,140,67,89,63,24,8,33,25,26,18,
                       14,28,79,15,35,10,30 },
       max_week=0,
       max_month=0,
       data[5000],
       subset[7][2000],
       index[7],
       phaseday[30]
       ;

// Initializations
   randomize();

// Load normalization factors from disk
   factors = fopen("C:\\MondPilz\\CD_PD.txt","r");
   i = 0;
   while (fscanf(factors, "%lf", &(cdpd[i++])) != EOF) {}
   fclose(factors);

   for (i=0;i<7;i++) {
     if (weekday_fr[i] > max_week) max_week=weekday_fr[i];
     n0 += weekday_fr[i];
     }
   for (i=0;i<4;i++) if (month_fr[i] > max_month) max_month=month_fr[i];

// Start date for all mushroom series
   date1( 1967, 7, 0, 12.e0, &xjd0);
   out = fopen("C:\\MondPilz\\Sample.txt","w");

   factor =  7*max_week*4*max_month/1766./1766.;

// Main Loop: How many samples are to be created
   for (iter = 0; iter < 1000; iter++ ) {

// Random date generation, subtract from 0.7.1967
   n = 0;
   for (i = 0; i<32; i++)
     {
     for (j=0; j <= factor*year_fr[i]; j++)
       data[n++] = (int) floor(randomdate_year(i+1967) - xjd0);
     }

// First step - filter out the months
   for (i=0; i<4; i++) index[i] = 0;

// Form 4 subsets for the months
   for (i=0; i<n; i++) {
     date2( &y, &m, &d, &et, xjd0 + data[i] );
     if ((m >= 7) && (m<11)) {
       subset[m-7][index[m-7]++] = data[i];
       if (index[m-7] == 1999) {
         printf("Datata overflow, month %d\n",m);
         fatal = 1;
         break;
         }
       }
     else {
       fatal = 1;
       printf("Fatal program error! Month %d\n",m);
       break;
       }
     }

   if (fatal) drop_out();

// Now we have the 4 subsets - thin them out
   for ( i = 0; i < 4; i++) {
     n1 = (max_month - month_fr[i])*max_week*7/1766;
     i0 = index[i];
     if (i0 == 0) {
       fatal = 1;
       printf("Program error: index[%d] = 0\n",i);
       drop_out();
       }
     for (j = 0; j < n1; j++ ) {
// Use negative number to mark them, skip numbers already cancelled
       while ( subset[i][k = (rand() % index[i])] < 0 ) {}
       subset[i][k] = -1;
     }
   }


// Now rejoin the subsets
   n = 0;
   for ( i = 0; i < 4; i++) {
     for (j = 0; j < index[i]; j++)
       if (subset[i][j] >= 0) data[n++] = subset[i][j];
   }

// Second step - filter out the days of the week
   for (i=0; i<7; i++) index[i] = 0;
   for (i=0; i<n; i++) {
     d = div((int)floor(data[i]+xjd0),7).rem;
       subset[d][index[d]++] = data[i];
       if (index[d] == 1999) {
         printf("Data overflow, month %d\n",m);
         fatal = 1;
         break;
         }
     }

   if (fatal) drop_out();

// Now we have the 7 subsets - thin them out
   for ( i = 0; i < 7; i++) {
     n1 = max_week - weekday_fr[i];
     i0 = index[i];
     if (i0 == 0) {
       fatal = 1;
       printf("Program error: index[%d] = 0\n",i);
       drop_out();
       }
     for (j = 0; j < n1; j++ ) {
// Use negative number to mark them, skip numbers already cancelled
       while ( subset[i][k = (rand() % index[i])] < 0 ) {}
       subset[i][k] = -1;
     }
   }

// Now rejoin the subsets
   n = 0;
   for ( i = 0; i < 7; i++) {
     for (j = 0; j < index[i]; j++)
       if (subset[i][j] >= 0) data[n++] = subset[i][j];
   }

// Add some more random dates to achieve prescribed size
   while (n < 1766) {
     data[n++] = (int) floor(randomdate(i+1967) - xjd0);
     }

// ... or thin the data out if necessary
   if (n > 1766) {
     for (i=0; i < n - 1766; i++) {
       while(data[j=rand()%(n-1766)] == -1){}
       data[j] = -1;
       }
     j = 0;
     for (i = 0; i < n; i++) {
       if (data[i] < 0) continue;
       if (j < i) data[j++] = data[i];
       }

     if (j != 1766) {
       printf("Program error - j = %d\n",j);
       drop_out();
       }
     else n = 1766;
     }

// Now: compute phaseday[i], i=1,..,30
   for (i=0; i<30; i++) phaseday[i] = 0;
   for (i=0; i<n; i++)
     phaseday[phase(xjd0+data[i])]++;

   for (i = 0; i < 30; i++) fprintf(out,"%9.4lf",phaseday[i]*cdpd[i]);
   fprintf(out,"\n");

   } // End of main loop

   fclose(out);

   return 0;
}
//---------------------------------------------------------------------------

Nussloch, im Februar 2002
Rüdiger Plantiko