簡體   English   中英

如何在每次類初始化時在C ++中獲得不同的隨機數

[英]How to get a different random number in c++ with each class initialization

我有一個名為Slime的敵人職業,每個黏液都沿着路徑移動(就像塔防游戲),並且我試圖獲得一個隨機數(它將告訴黏液何時更改路徑更改方向)。 但是我嘗試使用3個Slimes來嘗試,它們最終都具有相同的隨機數。 我的敵人的班級中包含以下代碼,以生成x和y的隨機數:

Enemy::Enemy(Level* level, float x, float y, float speed, int direction, int width, int height)
    :
    Entity(level, x, y, width, height), // Each enemy is an entity
    speed(speed),
    direction(direction)
{
    srand((unsigned)time(0));

    rangeX = (level->GetTileWidth() * level->GetScale() - width * level->GetScale()) - (width * level->GetScale()) + 1;
    rangeY = (level->GetTileHeight() * level->GetScale() - height * level->GetScale()) - (height * level->GetScale()) + 1;

    randNumX = (rand() % rangeX) + (width * level->GetScale());
    randNumY = (rand() % rangeY) + (height * leel->GetScale());
}

每當我創建一個新的Slime對象時,就會調用該代碼。 我正在測試三種不同的粘液,它們都給我相同的隨機數。 當我重新啟動它時,它們的編號與原始編號不同,但是所有三個史萊姆仍然具有相同的隨機數。 難道我做錯了什么? 我應該在該課程之外播種蘭特,以便只調用一次嗎? 而rangeX和rangeY只是在路徑內給了我一個數字,因此沒有敵人在草地上或在路徑上徘徊。

每次創建新的Slime對象時,您會將rand()重新播種為相同的值。 這意味着rand()為每個Slime產生相同的數字。

如果僅在程序開始時(在主程序中)對rand()進行一次播種,則將獲得不同的值。

丟掉srand((unsigned)time(0)); 當前線程第一次啟動時,僅執行一次。

如果確實需要每個對象都包含自己的隨機數生成器,則可以為每個對象配備實現此類隨機數生成器的類的實例,或者自己滾動; 您將在這里找到一些好主意: https : //stackoverflow.com/a/1640399/773113

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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