我对c++和oo非常陌生,所以这可能是非常愚蠢的事情。所有这些都在代码中,就在我的include语句之后。
enum ObjType { CUBE, CONE, };
typedef struct {
ObjType type;
float x;
float y;
float z;
int selected;
} object;
static object objects[] =
{
{ CUBE, rand()%11-4, rand()%-10-5, rand()%-65-55, 0},
{ CONE, rand()%11-4, rand()%-10-5, rand()%-65-55, 0},
}
我用我的主要方法给srand打了个电话,在当前的时间内经过。然而,每次程序出错时,这都会产生相同的随机数。我有什么不明白的?
发布于 2015-03-17 04:41:29
正如天顶所说,全局初始化发生在main()
之前。您也可以让srand()
首先运行,方法是声明一个全局变量,该变量具有调用srand()
的初始化,并且在static object objects[]
初始化之前。
static int x = (srand(time(NULL)), 10);
static object objects[] =
{
{ CUBE, rand()%11-4, rand()%-10-5, rand()%-65-55, 0},
{ CONE, rand()%11-4, rand()%-10-5, rand()%-65-55, 0},
};
但是全局变量通常是个坏主意,依赖诸如初始化顺序(只有在同一转换单元中初始化的对象之间才能很好地指定)是特别糟糕的。
相反,只需使用局部变量:
int main() {
srand(time(NULL));
object objects[] =
{
{ CUBE, rand()%11-4, rand()%-10-5, rand()%-65-55, 0},
{ CONE, rand()%11-4, rand()%-10-5, rand()%-65-55, 0},
};
// pass objects around as needed
foo(objects[0]);
foo(objects[1]);
}
C++标准库现在提供了优于srand()
、rand()
和手动转换结果以生成特定发行版的工具。使用标头<random>
,使用random_device
而不是time(NULL)
创建一个生成器(如std::mt19937
)并为其添加种子,并使用分发对象:
#include <random>
int main() {
std::random_device r;
std::seed_seq seed{r(), r(), r(), r(), r(), r(), r(), r()};
std::mt19937 eng(seed);
std::uniform_int_distribution<> dist;
object objects[] =
{
{ CUBE, dist(eng, {-4, 6}), dist(eng, {-5, 4}), dist(eng, {-55, 9}), 0},
{ CONE, dist(eng, {-4, 6}), dist(eng, {-5, 4}), dist(eng, {-55, 9}), 0},
};
// pass objects around as needed
foo(objects[0]);
foo(objects[1]);
}
请注意,这是多么容易阅读,直到直接声明所需的间隔,而不是依赖于%
的行为与负数。
(我甚至不确定您最初的间隔是否有错误,但我已经忠实地复制了它们,假设%
的常见行为为负数,直到C++11才标准化。)
发布于 2015-03-17 03:54:05
在输入main
之前将初始化全局变量。
objects
是一个全局变量,因为它是在任何函数之外声明的。
实际上,rand()
在srand()
之前被调用,从而产生相同的随机数。
https://stackoverflow.com/questions/29091010
复制相似问题