您沒有正確使用srand和rand函數。您應該爲隨機數生成器「種子」一次,然後使用rand()
從RNG檢索連續值。每個種子產生符合某些隨機性標準的特定數字序列。
取而代之的是,您每次播種隨機數發生器,然後檢索隨機序列中的第一個值。由於time()
的調用速度如此之快以至於它返回相同的種子,因此您將隨機數生成器有效地重置回相同序列的開始位置,因此您可以獲得與之前相同的編號。
即使由time()
返回的值更新得足夠快,以至於每次都有新的種子,仍不能保證好的隨機數。隨機數發生器被設計成產生一系列數字,其中該序列具有一定的統計特性。然而,不能保證相同的屬性保持超過從不同的序列中選擇的值。
因此,要使用確定性的隨機數生成器,您應該只生成一次發生器,然後消耗該種子生成的值序列。
另一點;用於實現rand()
的隨機數生成器在歷史上並不是很好,rand()
不是重入或線程安全的,並且將rand()
生成的值轉換爲具有所需分佈的值並不總是直截了當的。
在C++中,您應該更喜歡<random>
庫,它提供了更好的功能。以下是使用<random>
的示例。
#include <random>
#include <iostream>
int main() {
const int sides = 6;
int groups = 10, dice_per_group = 3;
std::uniform_int_distribution<> distribution(1,sides); // create an object that uses randomness from an external source (provided later) to produces random values in the given (inclusive) range
// create and seed the source of randomness
std::random_device r;
std::seed_seq seed{r(), r(), r(), r(), r(), r(), r(), r()};
std::mt19937 engine(seed);
for (int i=0; i<groups; ++i) {
for (int j=0; j<dice_per_group; ++j) {
// use the distribution with the source of randomness
int r = distribution(engine);
std::cout << "Die #" << j+1 << " rolled a " << r << '\n';
}
std::cout << '\n';
}
}
請注意,您不需要'rand()%5'附近的圓括號。此外,該表達式產生的值從4到4,因此'死亡[5]'永遠不會被擊中。爲了避免這種錯誤,使用常量來定義面的數量(而不是硬編碼6和5),並在數組定義中使用該常量並作爲除數。 –