我正在写一个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
重复两次。
答案 0 :(得分:6)
通常在srand
的代码的早期调用main
一次。
答案 1 :(得分:3)
宽度C ++ 11标准,您可以使用新的number generators。要获得始终不同的结果,通常必须在每次执行程序时设置不同的种子,例如随时间变化。
答案 2 :(得分: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;
}
另请注意,如果您要生成彩票号码,则可能不希望在同一个数组中使用相同的值两次,在这种情况下,您必须为代码添加更多逻辑。
答案 3 :(得分: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, " "));
}