gpt4 book ai didi

c++ - 用随机数初始化的对象

转载 作者:太空宇宙 更新时间:2023-11-03 10:27:22 24 4
gpt4 key购买 nike

我是 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},
}

我在我的 main 方法中调用 srand,传入当前时间。但是,每次程序出错时都会生成相同的随机数。我有什么不明白的?

最佳答案

正如 zenith 所说,全局变量的初始化发生在 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> ,创建并播种生成器,例如 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]);
}

请注意这是多么容易阅读,直接说明所需的间隔,而不是依赖如何 %用负数表现。

(我什至不确定你原来的间隔是不是错误,但我已经忠实地复制了它们,假设 % 的常见行为是负数,直到 C++11 才标准化。)

关于c++ - 用随机数初始化的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29091010/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com