?
multipilz5 schrieb:
Die Auflösung der if-Abfrage: Am Ende möchte ich das Spiel Marswürfel umsetzen. Bei diesem Spiel muss man mit 13 Würfeln Punkte sammeln. Auf zwei der sechs Seiten ist das selbe Symbol.
Also eigentlich hast Du einen Würfel mit 5 Seiten, von denen eine doppelt so häufig fällt, wie die anderen.
Das geht allerdings sehr viel besser in C++. Du kannst aus dem folgenden die ersten drei Funktionen einfach übernehmen.
Selbst, wenn es erstmal kryptisch aussieht, gibt es IMHO keinen Grund, Dir das mit rand() selbst zusammenzudengeln.
#include <iostream>
#include <random>
// Diese Funktion gibt irgendein Bitmuster zurueck (uniform random bit generator (URBG))
// Uebernommen aus W. E. Browns "Random Number Generation is Not Simple!"
// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3847.pdf
std::default_random_engine& global_urbg() {
static std::default_random_engine re;
return re;
}
// Dies entspricht srand()
void randomize() {
static std::random_device rd;
global_urbg().seed(rd());
}
// Ein Wuerfelwurf
// Dieser Würfel hat 5 Seiten, von denen eine doppelt so haeufig
// faellt wie die anderen
int roll_dice() {
static std::discrete_distribution<int> d{ 2, 1, 1, 1, 1 };
return d(global_urbg());
}
int main() {
// wir wollen "zufaelligen Zufall"
randomize();
// ein paarmal wuerfeln
// und das ergebnis in einem Array merken
// Ein Wuerfelwurf ist 0,1,2,3 oder 4, also nehmen wir ein int[5]
// und erhoehen die Zahl an der gewuerfelten Position um eins.
int results[5]={0};
for(int i=0; i<10000; ++i){
int ix = roll_dice();
results[ix]++;
}
// der erste wert duerfte ungefaehr doppelt so hoch
// sein, wie die anderen (die alle ca. gleichhoch sein sollten)
for(auto i : results)
std::cout << i << '\n';
}
Damit beantworte ich auch Deine Frage, wo denn srand() hinkommt (bzw. bei diesem code randomize() ): Einmal an den Anfang von main() oder gar nicht.
Näher kommen wir dem Spiel, wenn wir die Würfelseiten - die bisher die schnöden Zahlen 0-4 sind - noch benamsen:
#include <iostream>
#include <random>
// Diese Funktion gibt irgendein Bitmuster zurueck (uniform random bit generator (URBG))
// Uebernommen aus W. E. Browns "Random Number Generation is Not Simple!"
// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3847.pdf
std::default_random_engine& global_urbg() {
static std::default_random_engine re;
return re;
}
// Dies entspricht srand()
void randomize() {
static std::random_device rd;
global_urbg().seed(rd());
}
// Moegliche Wuerfelergebnisse
enum face { death_ray, tank, human, cow, chicken };
// Benamsung der Ergebnisse
const char* to_string(face f) {
static const char* names[] = { "death ray", "tank", "human", "cow", "chicken" };
return names[f];
}
// wuerfeln
// diesmal keine Zahl als Ergebnis, sondern eine der
// verschiedenen Wuerfelseiten
face roll_dice() {
static std::discrete_distribution<int> d{ 2, 1, 1, 1, 1 };
return static_cast<face>(d(global_urbg()));
}
int main() {
// wir wollen "zufaelligen Zufall"
randomize();
// ein paarmal wuerfeln und das ergebnis drucken
for(int i=0; i<42; ++i)
std::cout << to_string(roll_dice()) << std::endl;
}