簡體   English   中英

生成隨機數 - srand c ++

[英]generating random numbers - srand c++

我在使用srand時遇到了麻煩。

我想在100到200的間隔內生成一個隨機數。

該數字將繼續生成並放入數組中。 一旦再次調用該方法,就需要再次生成相同的隨機數序列。

因此,我需要種子,無論我嘗試什么,我似乎無法讓它工作。

我不是在尋找任何人編寫代碼而只是向我展示生成這些數字的正確格式。

UPDATE

我有一個火車對象,其中包含一個鏈表(排行列表中的每個位置都是一個滑架)。

每個列車中的車廂數量需要在區間100,200中是隨機的。

每個車廂中的煤量需要在區間1000,2000中隨機。

我正在嘗試實現一個模擬器類,它將創建一個隨機數量的車廂,其中包含隨機數量的數據。

希望更有意義。

苦苦思索如何實現它。

如果您只想重復任意序列,可以通過為srand()設置相同的參數來設置種子。

例如:

pax$ cat qq.c
#include <iostream>
#include <cstdlib>

int main (void) {
    srand (42);
    for (int i = 0; i < 5; i++) {
        int x = 100 + (rand() % 101);
        std::cout << x << std::endl;
    }
    std::cout << "=====" << std::endl;
    srand (42);
    for (int i = 0; i < 5; i++) {
        int x = 100 + (rand() % 101);
        std::cout << x << std::endl;
    }
    return 0;
}

pax$ g++ -o qq qq.cpp ; ./qq
163
166
148
137
149
=====
163
166
148
137
149

試試這個

void srand ( unsigned int seed );

如果seed設置為1,則將生成器重新初始化為其初始值,並生成與對rand或srand的任何調用之前相同的值。

如上所述,您可以通過使用相同的種子不止一次播種它。

srand(1234); // magic number

// .... 

srand(1234); // magic number again

rand()的輸出將從之前的相同點重新啟動。

當你在它時,我建議不要在rand()上使用模運算符,因為它不會導致值的均勻分布。 相反,您可以使用以下幫助程序獲取整數范圍內的隨機值:

int randRange(int M, int N)
{
     // see http://eternallyconfuzzled.com/arts/jsw_art_rand.aspx
     return M + rand() / ( RAND_MAX / ( N - M ) + 1 );
}

int nextrand = randRange(100,200);

有關更多背景信息,請參閱有關Eternally Confuzzled的鏈接文章 (由Julienne Walker提供),也有關播種的內容

C ++選項

上面的缺點是生成是完全順序的(你不能同時擁有兩個隨機生成器的實例)。 由於您使用C ++進行標記,為什么我們不使用它!

你可以使用tr1或c ++ 0x / c ++ 11 1 uniform_int_distribution

#include <random>
#include <functional>

std::uniform_int_distribution<int> distribution(100, 200);
std::mt19937 engine; // Mersenne twister MT19937

int nextrand  = distribution(engine);

一個直接的優勢是您可以讓多個引擎同時生成相同的序列(請參閱示例)。

正如你也可以看到,你可以像種子發電機engine(1234)就像用srand 實時查看示例:

  • C ++ 03 with boost: https//ideone.com/FC4xm

     #include <boost/random.hpp> #include <boost/random/uniform_int.hpp> int main() { boost::mt19937 engine1(1234); boost::mt19937 engine2(1234); boost::uniform_int<> dist(100,200); for (int i=0; i<20; i++) { std::cout << dist(engine1) << " is equal to " << dist(engine2) << std::endl; } } 

  • C ++ 0x http://ideone.com/467Aj
    同時展示一點語法糖:

     auto generator = std::bind(distribution, engine); nextrand = generator(); // more convenient use 

1 Boost.Random如果你使用C ++ 03

暫無
暫無

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

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