![](/img/trans.png)
[英]Why there are Random numbers in non initialized array but not in non initialized members of half initialized array in C++?
[英]Object initialized with random numbers
我是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,并传递了当前时间。 但是,这在每次程序出错时都会生成相同的随机数。 我不明白什么?
正如zenith所说的那样,全局变量的初始化发生在main()
之前。 您可以通过执行类似的操作来声明srand()
,该全局变量在初始化static object objects[]
之前进行初始化,从而使srand()
首先运行:
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才标准化。)
全局变量将在输入main
之前初始化。
您的objects
是全局变量,因为它是在任何函数外部声明的。
实际上, rand()
在srand()
之前被调用,导致相同的随机数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.