C++随机数生成器

4

我正在编写一款彩票应用程序。我有一个名为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

重复两次。


http://channel9.msdn.com/Events/GoingNative/2013/rand-Considered-Harmful 这里讲述了为什么不应该使用 rand() 和 srand(),以及为什么应该避免使用 "rand() % N"。还有为什么要使用 srand(time(NULL))... - Exceptyon
3
您可以查看 C++11 中的 <random> 特性,该特性提供了更好的伪随机数生成器(例如 Mersenne Twister),以及一个 random_device 接口,可用于使用硬件熵源对生成器进行种子初始化。请参考 http://en.cppreference.com/w/cpp/numeric/random。 - zakinster
4个回答

6

在代码中尽早调用srand,确保只调用一次


3

在C++11标准中,你可以使用新的数字生成器。通常情况下, 为了获得不同的结果,你需要在每次程序执行时设置不同的种子,例如使用时间。


1
你可以查看 c++11 特性,该特性提供了更好的伪随机数生成器 (例如 Mersenne Twister),以及可以用于使用硬件熵源对生成器进行种子处理的 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;
}

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


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, " "));
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接