首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用随机数初始化的对象

用随机数初始化的对象
EN

Stack Overflow用户
提问于 2015-03-17 03:52:19
回答 2查看 609关注 0票数 1

我对c++和oo非常陌生,所以这可能是非常愚蠢的事情。所有这些都在代码中,就在我的include语句之后。

代码语言:javascript
运行
复制
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打了个电话,在当前的时间内经过。然而,每次程序出错时,这都会产生相同的随机数。我有什么不明白的?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-17 04:41:29

正如天顶所说,全局初始化发生在main()之前。您也可以让srand()首先运行,方法是声明一个全局变量,该变量具有调用srand()的初始化,并且在static object objects[]初始化之前。

代码语言:javascript
运行
复制
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},
};

但是全局变量通常是个坏主意,依赖诸如初始化顺序(只有在同一转换单元中初始化的对象之间才能很好地指定)是特别糟糕的。

相反,只需使用局部变量:

代码语言:javascript
运行
复制
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 )并为其添加种子,并使用分发对象:

代码语言:javascript
运行
复制
#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才标准化。)

票数 5
EN

Stack Overflow用户

发布于 2015-03-17 03:54:05

在输入main之前将初始化全局变量。

objects是一个全局变量,因为它是在任何函数之外声明的。

实际上,rand()srand()之前被调用,从而产生相同的随机数。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29091010

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档