C :: Aufgabe #109

1 Lösung Lösung öffentlich

Stochastisches Problem

Fortgeschrittener - C von Veigar - 21.05.2016 um 15:01 Uhr
Liebe Menschen,
Wie mein Vorgänger ist mir ein mathematisches Problem eingefallen, es scheint nicht bekannt zu sein und mir ist bis jetzt selber noch keine "echte" Lösung in den Sinn gekommen, also nicht einfach eine sehr gute Annäherung.

Die Aufgabe: Eine Feder liegt in einen 1-Dimensionalen Raum a Längeineinheiten von der einen Kante A und b Längeneinheiten von der anderen Kante B entfernt und wird in jeder Zeiteinheit entweder in die eine Richtung oder in die andere Richtung geweht, vom Wind oder so.

Schreibe ein Programm das dir in einer sehr guten Annäherung oder "exakt" für jedes dieser Probleme in der Problemschar bestimmt wie wahrscheinlich es ist das es von der einen Seite oder von der anderen Seite fällt.

ps: das Bild ist ein Nebenprodukt meines eigenen Lösungsprogrammes gewesen, ich muss sagen ich habe mir die grafische Darstellung deutlich cooler erhofft, aber es zeigt ganz gut das Problem das es unendlich viele, in die Lösung einfließende "Äste"gibt.

es grüßt liebevoll und zärtlich wie immer,
Veigar

Lösungen:

vote_ok
von devnull (8870 Punkte) - 12.04.2017 um 09:21 Uhr
Das Programm simuliert die Bewegung der Feder per Zufallsgenerator.
In Vorwärtsrichtung ist die Wegstrecke begrenzt (LENGTH), im Programm wurde das 5fache der Breite (10) gewählt.
Die Wahrscheinlichkeiten (Risiken) für links- und rechtsseitigen Absturz werden berechnet sowie die Erfolgschance für den Durchgang.

Konsolenausgabe:

Streckenlänge  : 50
Anzahl Versuche: 100000
|----------------------------|
Startposition : a=0, b=10
Risiko links : 88.9%
Risiko rechts : 5.6%
Erfolgschance : 5.5%
|----------------------------|
Startposition : a=1, b=9
Risiko links : 77.7%
Risiko rechts : 11.2%
Erfolgschance : 11.1%
|----------------------------|
Startposition : a=2, b=8
Risiko links : 67.5%
Risiko rechts : 17.5%
Erfolgschance : 15.0%
|----------------------------|
Startposition : a=3, b=7
Risiko links : 57.3%
Risiko rechts : 23.9%
Erfolgschance : 18.8%
|----------------------------|
Startposition : a=4, b=6
Risiko links : 48.1%
Risiko rechts : 31.6%
Erfolgschance : 20.3%
|----------------------------|
Startposition : a=5, b=5
Risiko links : 39.0%
Risiko rechts : 39.1%
Erfolgschance : 21.9%
|----------------------------|
Startposition : a=6, b=4
Risiko links : 31.5%
Risiko rechts : 48.1%
Erfolgschance : 20.4%
|----------------------------|
Startposition : a=7, b=3
Risiko links : 23.8%
Risiko rechts : 57.2%
Erfolgschance : 19.0%
|----------------------------|
Startposition : a=8, b=2
Risiko links : 17.6%
Risiko rechts : 67.5%
Erfolgschance : 14.9%
|----------------------------|
Startposition : a=9, b=1
Risiko links : 11.3%
Risiko rechts : 77.8%
Erfolgschance : 10.9%
|----------------------------|
Startposition : a=10, b=0
Risiko links : 5.6%
Risiko rechts : 88.9%
Erfolgschance : 5.5%

Quellcode ausblenden C-Code
/*****************************************
 * random_feather.c  Zufallsweg der Feder
 *****************************************/
#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <limits.h>

#define MAX_TRIALS      UINT_MAX

#define BORDER_A        0   // +-------+  +---->x
#define BORDER_B       10   // |       |  |
#define START_X         0   // |       |  |
#define START_Y         0   // |       |  V
#define LENGTH         50   // |       |  y


/* random seed generator */
int init_random_seed(void) {
  return open("/dev/urandom", O_RDONLY);
}

void get_random_seed(int urandom_fd, unsigned int *seed) {
  if (urandom_fd > 0) {
    /* get seed from the urandom device */
    read(urandom_fd, seed, sizeof(unsigned int));
  }
}

/* main */
int main(int argc, char **argv) {
    unsigned int total, total_left, total_right, total_succ;
    unsigned int t, tmax, seed_val;
    int direction, seed_rc;
    int x_start, x, y;

    tmax = MAX_TRIALS;
    if (argc > 1)
        tmax = (unsigned)atoi(argv[1]);

	printf("Streckenlänge  : %u\n", LENGTH);
    printf("Anzahl Versuche: %u\n", tmax);

    seed_rc = init_random_seed();
    if (seed_rc <= 0) {
		fprintf(stderr, "cannot seed random number generator\n");
		exit(EXIT_FAILURE);
	}

	for (x_start=START_X; x_start<=BORDER_B; x_start++) {
		total_left=total_right=total_succ=total=0;
		get_random_seed(seed_rc, &seed_val);

		for (t=1; t<=tmax; t++, total++) {
			get_random_seed(seed_rc, &seed_val);
			srand(seed_val);

			x = x_start;
			y = START_Y;
			for (;;) {
				direction = (int)(2L*rand()/RAND_MAX);
				switch (direction) {
					case 0:	--x; ++y; break;
					case 1:	++x; ++y; break;
				   default: continue;
				}
				if (x < BORDER_A) {
					total_left++;
					break;
				}
				else if (x > BORDER_B) {
					total_right++;
					break;
				}
				else if (y > LENGTH) {
					total_succ++;
					break;
				}
			}
		}
		printf("|----------------------------|\n");
		printf("Startposition : a=%u, b=%u\n", x_start, BORDER_B-x_start);
		printf("Risiko links  : %4.1f%%\n", 100.0*total_left/total);
		printf("Risiko rechts : %4.1f%%\n", 100.0*total_right/total);
		printf("Erfolgschance : %4.1f%%\n", 100.0*total_succ/total);
	}
    return 0;
}
1810273

Du scheinst einen AdBlocker zu nutzen. Ich würde mich freuen, wenn du ihn auf dieser Seite deaktivierst und dich davon überzeugst, dass die Werbung hier nicht störend ist.