Mit dem Auto, dem Zug, dem Fahrrad oder zu Fuß? (Simulationen)
Schreiben Sie ein Programm, das entweder «Auto», «Zug», «Fahrrad» oder «Zu Fuß» ausgibt und zwar mit den Wahrscheinlichkeiten 3:3:2:1. Von 1000 Aufrufen sollen also etwa 1/3 «Auto», 1/3 «Zug», 2/9 «Fahrrad» bzw. 1/9 «Zu Fuß» ausgegeben werden.
Zusatzaufgabe: Schreiben Sie obiges Programm so um, dass es 20 Ausgaben durchführt. Ändern Sie danach das Programm so ab, dass zu Testzwecken immer die selbe Zufallsfolge erzeugt wird; dies kann mit dem sog. Seed erreicht werden. Der Seed ist das x0 aus der Aufgabe 10.1 («Lineare Kongruenzmethode» aus dem Buch "Programmieren Lernen" - Seite 122). Die meisten Programmiersprachen bieten es an, den Seed selbst zu wählen.
0 Kommentare
13 Lösung(en)
// see https://github.com/pheek/WalkerCategories
import eu.gressly.math.random.WalkerCategories;
// see https://github.com/pheek/javaSequencer
import static eu.gressly.util.Sequencer.seq;
public class AutoZugFahrradFuss {
public static void main(String[] args) {
new AutoZugFahrradFuss().top();
}
String[] fortbewegung = {"Auto", "Zug", "Fahrrad", "zu Fuss"};
void top() {
WalkerCategories wc = new WalkerCategories(new double[]{3, 3, 2, 1});
for(int i : seq(1, 1000)) {
int kategorie = wc.getWeightedCategory(Math.random());
System.out.println(i + ". " + fortbewegung[kategorie]);
}
}
} // end of class AutoZugFahrradFuss
Lösung von: Philipp G. Freimann (BBW (Berufsbildungsschule Winterthur) https://www.bbw.ch)
// see https://github.com/pheek/WalkerCategories
import eu.gressly.math.random.WalkerCategories;
// see https://github.com/pheek/javaSequencer
import static eu.gressly.util.Sequencer.seq;
import java.util.Random;
public class AutoZugFahrradFuss {
public static void main(String[] args) {
new AutoZugFahrradFuss().top();
}
String[] fortbewegung = {"Auto", "Zug", "Fahrrad", "zu Fuss"};
void top() {
Random r = new Random();
r.setSeed(55);
WalkerCategories wc = new WalkerCategories(new double[]{3, 3, 2, 1});
for(int i : seq(1, 20)) {
int kategorie = wc.getWeightedCategory(r.nextDouble());
System.out.println(i + ". " + fortbewegung[kategorie]);
}
}
} // end of class AutoZugFahrradFuss
Lösung von: Philipp G. Freimann (BBW (Berufsbildungsschule Winterthur) https://www.bbw.ch)
using System;
using System.Collections.Generic;
using System.Linq;
namespace Auto_Zug_Fahrrad_Fuß {
class Program {
public static string Transport(int? seed = null) {
int
min = 1, max = 10,
transporter =
seed == null ?
Singleton.GetRandom().Next(min, max) :
Singleton.GetRandom((int)seed).Next(min, max);
return
transporter < 4 ? "Auto" :
transporter < 7 ? "Zug" :
transporter < 9 ? "Fahrrad" :
"Fuß";
}//Ende Transport
static void Main(string[] args) {
for (int i = 1; i <= 20; i++)
Console.WriteLine("{0,2}: {1}", i, Transport(5));
Console.ReadKey(true);
}//Ende Main
}
class Singleton {
private static Random random;
private static Dictionary<int, Random> randomWithSeed;
public static Random GetRandom() {
if (random == null)
random = new Random();
return Singleton.random;
}
public static Random GetRandom(int seed) {
if (randomWithSeed == null) randomWithSeed = new Dictionary<int, Random>();
if (!randomWithSeed.ContainsKey(seed))
randomWithSeed.Add(Math.Abs(seed), new Random(seed));
return randomWithSeed.First(x => x.Key == seed).Value;
}
}//Ende Singleton
}
Lösung von: Marcel Kapma ()
Math.sRandom = function(seed) {
return {
next: function() {
module = 2e32;
seed *= 2e32 - 1; // faktor
seed += 12345; // schrittweite
return (seed %= module) / module;
}
}
}
var rnd = Math.sRandom(26),
i = 1;
function locomotion() {
var choice = rnd.next() * 9 + 1;
if (choice <= 3) return "Auto";
if (choice <= 6) return "Zug";
if (choice <= 8) return "Fahrrad";
return "zu Fuß";
}
for (i; i <= 20; i++) console.log(locomotion());
Lösung von: Lisa Salander (Heidi-Klum-Gymnasium Bottrop)
#include <iostream>
#include <random>
using namespace std;
int random = 0;
int main() {
random_device rn;
mt19937 engine(rn());
engine.seed(1);
for (int i = 0; i < 20; i++) {
uniform_int_distribution<int> dice(1, 9);
random = dice(engine);
switch (random) {
case 1:
cout << "Du faehrst mit dem Auto!" << endl;
break;
case 2:
cout << "Du faehrst mit dem Auto!" << endl;
break;
case 3:
cout << "Du faehrst mit dem Auto!" << endl;
break;
case 4:
cout << "Du faehrst mit dem Zug!" << endl;
break;
case 5:
cout << "Du faehrst mit dem Zug!" << endl;
break;
case 6:
cout << "Du faehrst mit dem Zug!" << endl;
break;
case 7:
cout << "Du faehrst mit dem Fahrrad!" << endl;
break;
case 8:
cout << "Du faehrst mit dem Fahrrad!" << endl;
break;
case 9:
cout << "Du gehst zu Fuß!" << endl;
break;
}
}
system("PAUSE");
return 0;
}
Lösung von: Loris Leitner (Imma-Mack-Realschule Eching)
import java.util.Random;
public class AutoZugFahrradFuß {
public static void main(String[] args) {
String [] methode= {"Auto","Zug","Fahrrad","Zu Fuß"};
Random random = new Random();
int ergebnis = random.nextInt(9);
switch (ergebnis){
case 1 : case 2 : case 3: System.out.println(methode[1]); break;
case 4 : case 5 : case 6: System.out.println(methode[2]); break;
case 7 : case 8 : System.out.println(methode[3]); break;
case 9 : System.out.println(methode[4]); break;
}
}
}
Lösung von: Name nicht veröffentlicht
import random
#Ohne Zusatzaufgabe
x = random.randint(1,10)
if x <= 3:
print("Auto")
elif 3 < x <= 6:
print("Zug")
elif 6 < x <= 8:
print("Fahrrad")
else:
print("Zu Fuß")
Lösung von: Patrick L. (Gymnasium Friedrich II)
* Aufgabe ohne Seed.
REPORT zautofahrrad.
DATA: lv_int TYPE i.
DO 20 TIMES.
CALL FUNCTION 'GENERAL_GET_RANDOM_INT'
EXPORTING
range = 8 " Zufallszahl von 0-8
IMPORTING
random = lv_int.
IF lv_int <= 2.
WRITE: / 'Auto'.
ELSEIF lv_int > 2 AND lv_int <= 5.
WRITE: / 'Bahn'.
ELSEIF lv_int > 5 AND lv_int <= 7.
WRITE: / 'Fahrrad'.
ELSEIF lv_int = 8.
WRITE: / 'Zu Fuß'.
ENDIF.
ENDDO.
Lösung von: Alexander S. (msg systems)
// NET 6.x | C# 10.x | VS-2022
// 1000 x Zufall (Verhältnis 3:3:2:1)
var lst = Enumerable.Range(1, 1000).Select(x => new Random().Next(1, 10) switch { <= 3 => "Auto", <= 6 => "Zug", <= 8 => "Fahrrad", _ => "zu Fuss" }).ToList();
// Auswertung
var eval = lst.GroupBy(x => x).Select(x => new {type = x.Key, count = x.Count(), percent = x.Count() * 100.0 / 1000}).Select(x => (x.type, x.count, x.percent)).OrderBy(x => -x.count).ToList();
// Ausgabe
Console.WriteLine(string.Join("-", lst)); // wenn es unbedingt sein soll... ;)
eval.ForEach(x => Console.WriteLine($"{x.count} x {x.type} ({x.percent}%)"));
Lösung von: Jens Kelm (@JKooP)
// C++ 14 | VS-2022
#include <iostream>
#include <vector>
#include <map>
#include <algorithm>
#include <iomanip>
std::map<std::string, int> get_grouped_vector(const std::vector<std::string>& v) {
std::map<std::string, int> m;
for (const auto& i : v)
if (m.count(i)) m[i]++;
else m.emplace(i, 1);
return m;
}
std::vector<std::string> get_probabilities(int n) {
srand((int)time(nullptr));
std::vector<std::string> v;
for (auto i{ 0 }; i < n; i++)
switch (rand() * 1000 % 9 + 1) {
case 1: case 2: case 3: v.push_back("Auto"); break;
case 4: case 5: case 6: v.push_back("Zug"); break;
case 7: case 8: v.push_back("Fahrrad"); break;
case 9: v.push_back("zu Fuss"); break;
}
return v;
}
int main() {
for(const auto& g : get_grouped_vector(get_probabilities(1000)))
std::cout << g.first << "\t\t" << g.second << "\t" << std::fixed << std::setprecision(2) << g.second * 100.0 / 1000 << " %\n";
}
Lösung von: Jens Kelm (@JKooP)
' VBA
Option Base 1
Function GetProbabilities(n%)
Dim arr(1 To 4)
Randomize
For i% = 1 To n
Select Case CInt(Rnd * 1000 Mod 9 + 1)
Case 1 To 3: arr(1) = arr(1) + 1 'Auto
Case 4 To 6: arr(2) = arr(2) + 1 'Zug
Case 7 To 8: arr(3) = arr(3) + 1 'Fahrrad
Case 9: arr(4) = arr(4) + 1 'zu Fuss
End Select
Next
GetProbabilities = arr
End Function
Sub Main()
p = GetProbabilities(1000)
arr = Array("Auto", "Zug", "Fahrrad", "Zu Fuss")
For i% = 1 To 4
Debug.Print arr(i), p(i) * 100# / 1000
Next
End Sub
Lösung von: Jens Kelm (@JKooP)
// C++ 20 | VS-2022
#include <iostream>
#include <array>
#include <numeric> // accumulate
inline const auto get_probabilities(size_t num_) {
std::array<size_t, 9> arr{};
for (size_t i{ 0 }; i < num_; ++i) arr[rand() % 9]++;
auto it{ arr.begin() };
const auto per{ [&it, &num_](int beg, int end) { return std::accumulate(it + beg, it + end, 0) * 100.0 / num_; } };
return std::make_tuple( per(0, 3), per(3, 6), per(6, 8), per(8, 9) );
}
template<typename Ty_>
inline const std::ostream& print(std::ostream& os, const Ty_& tuple_) {
const auto [car, train, bicycle, walk] = tuple_; // C++ 20
os << "Auto: " << car << "\n";
os << "Zug: " << train << "\n";
os << "Fahrrad: " << bicycle << "\n";
os << "Zu Fuss: " << walk << "\n";
return os;
}
int main() {
srand((int)time(nullptr));
print(std::cout, get_probabilities(1'000));
}
Lösung von: Jens Kelm (@JKooP)
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#define ROUNDS 1000
typedef struct _MeansOfTransportation_{
char name[5];
size_t sum;
}MOT;
int main() {
srand(time(NULL));
size_t arr[9] = {};
for(size_t i = 0; i < ROUNDS; i++)
arr[rand() % 9]++;
MOT mot[4] = {
{"car", arr[0] + arr[1] + arr[2]},
{"train", arr[3] + arr[4] + arr[5]},
{"bike", arr[6] + arr[7]},
{"walk", arr[8]}
};
for(size_t i = 0; i < 4; i++)
printf("%s:\t %.1f%c\n", mot[i].name, mot[i].sum * 100.0 / ROUNDS, '%');
}
/*
car: 29.1%
train: 35.8%
bike: 22.3%
walk: 12.8%
*/
Lösung von: Jens Kelm (@JKooP)
Aktionen
Neue Lösung hinzufügen
Bewertung
Durchschnittliche Bewertung:
Meta
Zeit: | 0.5 |
Schwierigkeit: | Mittel |
Webcode: | tfod-exee |
Autor: | Philipp G. Freimann (BBW (Berufsbildungsschule Winterthur) https://www.bbw.ch) |