簡體   English   中英

用隨機數初始化的對象

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM