Buch Cover Buch Cover Buch Cover Buch Cover

Web-Code: - Webcode Help

Geburtstags-Paradoxon (Algorithmen)

Du feierst eine Geburtstagsparty. Nach und nach kommen immer mehr Gäste. Während des Wartens stellst du dir die Frage, wie viele der anwesenden Personen ebenfalls heute Geburtstag haben könnten.

Schreibe eine Methode/Funktion, die einen Wert zurückliefert, ab wie vielen Gästen die Wahrscheinlich bei größer 50% liegt, dass mindestens noch ein Gast am gleichen Tag Geburtstag hat.

Bedingungen:

- nur der Tag des Jahres, nicht zusätzlich das Geburtsjahr sollen übereinstimmen

- das Jahr hat konstant 365 Tage

- saisonal bedingte Geburtenraten sollen nicht betrachtet werden

0 Kommentare

Bitte melde dich an um einen Kommentar abzugeben

4 Lösung(en)

from functools import reduce
from fractions import Fraction

def birthday_problem(min_probability, days=365):
    for persons in range(1, days+2):
        prob = 1-Fraction(reduce(lambda x, y: x*y, range(days-persons+1, days), 1), days**(persons-1))
        if prob >= min_probability:
            return persons, prob

print(f"min p = {(p:=0.5)}\nn = {(x:=birthday_problem(p))[0]}\np = {x[1]} = {float(x[1])}")
# Theoretisch würde hier ein einfaches
# print(23)
# reichen. Man hätte die Aufgabe interessanter gestalten sollen,
# sodass z. B. die Mindestwahrscheinlichkeit variabel ist.
                

Lösung von: Name nicht veröffentlicht

// NET Core 3.x

using System.Linq;
using static System.Linq.Enumerable;
using static System.Console;
using static System.Math;

namespace CS_MDL_CORE_Geburtstags_Paradoxon
{
    class Program
    {
        static void Main()
        {
            const double Prob = 50.0;
            WriteLine($"Eine Wahrscheinlichkeit von {Prob}% liegt ab {GetNumOfPers(Prob)} Personen vor.\n");
            Range(5, 95).Where(x => x % 5 == 0).ToList().ForEach(x => WriteLine($"{x,2}%: {GetNumOfPers(x),2} Pers"));
        }
        static double GetProb(int n) => (Pow(365, n) - Range(365 - n + 1, n).Aggregate(1.0, (x, y) => x * y)) / Pow(365, n) * 100;
        static int GetNumOfPers(double p) => Range(1, 365).Where(x => GetProb(x) >= p).FirstOrDefault();
    }
}
                

Lösung von: Jens Kelm (@JKooP)

// C++ 11

#include <iostream>
#include <iomanip>
using namespace std;

double get_prob(const int& n) {
	auto p{ 1.0 };
	for (auto i = 365 - n + 1; i <= 365; i++) p *= i;
	return (pow(365, n) - p) / pow(365, n) * 100;
}

int get_number_of_persons(const double& p) {
	for (auto k = 1; k <= 366; k++)
		if (get_prob(k) >= p) return k;
	return 0;
}

int main()
{
	const auto& prob{ 50.0 };
	cout << "Eine Wahrscheinlichkeit von " << prob << "% liegt ab " << get_number_of_persons(prob) << " Personen vor.\n\n";
	for (auto i = 5; i < 100; i+=5)
		cout << setw(2) << i << "%: " << setw(2) << get_number_of_persons(i) << " Pers" << endl;
}
                

Lösung von: Jens Kelm (@JKooP)

let propableNumberOfBirthdayBuddies = function() {
  let guests = 1,
      propability = 0,
      tmp;
  while (propability <= .5) {
    guests++;
    tmp = 1;
    for (let i = 365; i > 365-guests; i--) tmp *= i;
    propability = 1 - tmp / 365 ** guests;
  }
  return guests;
}

// ausgabe
console.log(propableNumberOfBirthdayBuddies());
                

Lösung von: Lisa Salander (Heidi-Klum-Gymnasium Bottrop)

Aktionen

Bewertung

Durchschnittliche Bewertung:

Eigene Bewertung:
Bitte zuerst anmelden

Meta

Zeit: 0.5
Schwierigkeit: Mittel
Webcode: xtx0-tkzq
Autor: ()

Download PDF

Download ZIP

Zu Aufgabenblatt hinzufügen