我对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},
}
Run Code Online (Sandbox Code Playgroud)
我在我的主要方法中调用srand,传入当前时间.但是,每次程序错误时,这都会生成相同的随机数.我不明白的是什么?
正如天顶所说,全局化的初始化发生在之前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},
};
Run Code Online (Sandbox Code Playgroud)
但无论如何,全局变量通常都是一个坏主意,并且依赖于初始化顺序(在同一翻译单元中初始化的对象之间只能很好地指定)之类的东西特别糟糕.
而只是使用局部变量:
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]);
}
Run Code Online (Sandbox Code Playgroud)
C++标准库提供优于设施srand(),rand()和手动变换所述结果来产生特定分布.使用标题<random>,创建和种子生成器,例如std::mt19937使用random_device而不是time(NULL),并使用分发对象:
#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]);
}
Run Code Online (Sandbox Code Playgroud)
注意这是多么容易阅读,直到说明所需的间隔,而不是依赖于%负数的表现.
(我甚至不确定你的原始间隔是不是错误,但我忠实地再现了它们,假设%负数的常见行为,在C++ 11之前甚至没有标准化.)
| 归档时间: |
|
| 查看次数: |
153 次 |
| 最近记录: |