4

我正在写一个彩票申请。我有一个名为generateLotteryNumbersthis 的函数,它接收一个数组并用 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

重复了两次。

4

4 回答 4

6

只调用srand 一次,通常在代码的早期main

于 2013-11-07T13:45:18.370 回答
3

宽度 C++11 标准,您可以使用新的数字生成器。为了始终获得不同的结果,通常您必须在每次程序执行时设置不同的种子,例如时间。

于 2013-11-07T13:51:34.063 回答
1

您可以查看提供更好的伪随机数生成器(例如 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;
}

另请注意,如果您正在生成彩票号码,您可能不希望在同一个数组中出现两次相同的值,在这种情况下,您必须在代码中添加更多逻辑。

于 2013-11-07T14:02:50.587 回答
0

你不应该srand多次调用。此外,您不应该使用rand这种方式来生成彩票号码(好的,取决于彩票,但我认为不允许重复号码)。你可以很容易地使用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, " "));
}
于 2013-11-07T14:23:24.953 回答