【发布时间】:2016-08-24 16:25:04
【问题描述】:
当我试图将一个函数作为参数传递给另一个函数时,我在使用 C++ 时遇到了这个奇怪的事情。这里的问题是它有效但没有给我预期的结果。 这是我的代码(msvc2013):
#include <stdio.h> /* printf, NULL */
#include <stdlib.h> /* srand, rand */
#include <time.h> /* time */
#include <iostream>
typedef unsigned int uint32_t;
typedef unsigned char uint8_t;
using namespace std;
#include "stdafx.h"
uint32_t random_color()
{
uint8_t r = rand() % 255;
uint8_t g = rand() % 255;
uint8_t b = rand() % 255;
uint32_t rgb = ((uint32_t)r << 16 | (uint32_t)g << 8 | (uint32_t)b);
return rgb;
}
void print_rgb(uint32_t(*color_generator)() = &random_color)
{
std::cout << color_generator << std::endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
for (int i = 0; i < 5; i++)
{
srand(time(NULL));
print_rgb();
}
system("PAUSE");
return 0;
}
这段代码的目的更复杂,但这是一个最小的例子。
问题:虽然如您所见,有一个srand(time(NULL)); 可以让rand() 更改值,但它没有!
这有什么原因吗?我错过了什么吗?
【问题讨论】:
-
如果你需要随机数,不要使用
rand()。问题是您使用相同的种子在循环内播种 rng 并且两次迭代之间的时间不会改变。 SO上有几十个重复项。 -
这不是目前的问题,但只调用一次
srand。不要每次循环调用它。 -
如果它没有给出预期的结果,那么它就不起作用。