我正在用 C 構建一個隨機字符生成器,??我有大約 12 個大的if陳述句塊,如下所示:
int wisdom = rand() % 18;
cout << "\n";
if (wisdom == 0 || wisdom == 1) {
cout << "Wisdom Score: 1\n";
cout << "Modifier: -5\n";
} else if (wisdom == 2 || wisdom == 3) {
cout << "Wisdom Score: " << wisdom << "\n";
cout << "Modifier: -4\n";
} else if (wisdom == 4 || wisdom == 5) {
cout << "Wisdom Score: " << wisdom << "\n";
cout << "Modifier: -3\n";
} else if (wisdom == 6 || wisdom == 7) {
cout << "Wisdom Score: " << wisdom << "\n";
cout << "Modifier: -2\n";
} else if (wisdom == 8 || wisdom == 9) {
cout << "Wisdom Score: " << wisdom << "\n";
cout << "Modifier: -1\n";
} else if (wisdom == 10 || wisdom == 11) {
cout << "Wisdom Score: " << wisdom << "\n";
cout << "Modifier: 0\n";
} else if (wisdom == 12 || wisdom == 13) {
cout << "Wisdom Score: " << wisdom << "\n";
cout << "Modifier: 1\n";
} else if (wisdom == 14 || wisdom == 15) {
cout << "Wisdom Score: " << wisdom << "\n";
cout << "Modifier: 2\n";
} else if (wisdom == 16 || wisdom == 17) {
cout << "Wisdom Score: " << wisdom << "\n";
cout << "Modifier: 3\n";
} else {
cout << "Wisdom Score: 18\n";
cout << "Modifier: 4\n";
}
我想知道,有沒有更好的方法來寫這個?也許某種型別的功能?
uj5u.com熱心網友回復:
更好的方法是根本不寫chained ifs,而是計算你關心的值。
if (wisdom == 0) wisdom = 1; // Handle edge case treating 0 as 1
int modifier = wisdom / 2 - 5;
cout << "Wisdom Score: " << wisdom << '\n';
cout << "Modifier: " << modifier << '\n';
請注意,您的計算int wisdom = rand() % 18; 無法產生 18 (并且確實產生0了您不想要的),因此您可能希望將其更改為:
int wisdom = rand() % 18 1; // Result guaranteed to be 1-18 inclusive
允許您通過洗掉if (wisdom == 0) wisdom = 1;邊緣情況來簡化代碼。
正如另一個答案已經指出的那樣,rand通常被認為是一個糟糕的 API,所以除非你對有偏見的結果感到滿意(例如,低投比高投略多),否則你會想要使用現代 C PRNG API(它們有點更多的作業需要設定,但一旦你這樣做了,使用起來就很簡單了,它們應該避免偏見問題)。
uj5u.com熱心網友回復:
使用 2 個整數值相除會導致結果被截斷的事實:
...
int modifier = (wisdom / 2) - 5;
uj5u.com熱心網友回復:
你不需要任何條件。另外,不要使用rand() %.
std::mt19937 mt(42); // seed
auto const wisdom = std::uniform_int_distribution<int>(0,18)(mt);
auto const score = wisdom !wisdom;
auto const mod = wisdom / 2 - 5;
std::cout << "Wisdom Score: " << score << "\n";
std::cout << "Modifier: " << mod << "\n";
這假設與其他分數相比,您有雙倍的機會獲得智慧分數 1。std::uniform_int_distribution如果不將構造中的下界從 更改1為0。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/496779.html
標籤:C
下一篇:c 向量指標參考問題
