簡體   English   中英

C ++隨機數生成器

[英]C++ random number generator

我正在寫一個lottory應用程序。 我有一個名為generateLotteryNumbers的函數,它接收一個數組並用5個隨機數填充該數組。 我想要做的是每次調用此函數時,此函數都會生成一組不同的隨機數。

void generateLotteryNumbers(int lotteryNumbers[])
{

    srand (time(NULL));
    const int arraySize = 5;
    int index = 0;

    while (index < arraySize)
    {
        lotteryNumbers[index] = rand() % 50 + 1;
        cout << lotteryNumbers[index] << endl;
        index++;
    }
}

目前的輸出是例如:

5
24
45
26
47

重復兩次。

正好調用srand 一次 ,通常是在main的代碼中。

寬度為C ++ 11標准,您可以使用新的數字生成器 要獲得始終不同的結果,通常必須在每次執行程序時設置不同的種子,例如隨時間變化。

您可以查看提供更好的偽隨機數生成器(例如Mersenne Twister)的c ++ 11功能,以及可用於通過硬件熵源為發生器播種的random_device接口。

使用std::vector和c ++ 11 <random>功能的示例:

vector<int> generateLotteryNumbers(int size)
{
    static std::random_device rseed;
    static mt19937 rgen(rseed());
    uniform_int_distribution<int> idist(1,50); 

    vector<int> result;
    for(int i = 0; i < size; ++i) {
        result.push_back(idist(rgen));
        cout << result[i] << endl;
    }
    return result;
}

另請注意,如果您要生成彩票號碼,則可能不希望在同一個數組中使用相同的值兩次,在這種情況下,您必須為代碼添加更多邏輯。

你不應該多次調用srand 此外,您不應該使用rand這種方式來生成彩票號碼(好吧,取決於彩票,但我認為不允許重復的數字)。 你可以使用std::random_shuffle輕松std::random_shuffle

int main()
{
    int numbers[49];  // all numbers
    std::iota(begin(numbers), end(numbers), 1);  // fill with 1-49

    // shuffle numbers
    std::random_shuffle(begin(numbers), end(numbers));  

    // use first 5 numbers:
    std::copy(begin(numbers), begin(numbers) + 5, 
        std::ostream_iterator<int>(std::cout, " "));
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM