0

こんにちは、いくつかのジョブ スケジューリング アルゴリズムをシミュレートしようとしています。リクエストのポアソン到着関数を作成しようとしています。ウィキペディアでポアソン到着のアルゴリズムを見つけ、それを実装して実行しましたが、常に同じ結果が得られます(例 l=15 -> 14 を返し、 l=1/15 は 0 を返します)

#include <cmath>
#include <iostream>
#include <cstdlib>
using namespace std;
main (){
for (int i=0;i<1000;i++)
{

float l=25;
float L=exp(-l);
float k=0;
float p=1;
//begin while
do{ 
k=k+1;
// Generate a random number between 0 and 1
// return a uniform number in [0,1].
double u = rand() / (double)RAND_MAX;   
p=p*u;
}   while (p>L);    
return k-1;
}}

これは私がこれを作成するために使用したアルゴリズムです

algorithm poisson random number (Knuth):
init:
     Let L ← e−λ, k ← 0 and p ← 1.
do:
     k ← k + 1.
     Generate uniform random number u in [0,1] and let p ← p × u.
while p > L.
return k − 1.

前もって感謝します

4

1 に答える 1

4

あなたの質問は少し不明確ですが、あなたの問題は、プログラムを実行するたびに異なる乱数を期待していることだと思います. rand() は、何らかのシード値を指定しない限り、プログラムを実行するたびに同じ乱数列を生成することに注意してください。

これを行う標準的な方法は、以下のように、現在の時間を使用して乱数ジェネレーターをシードすることです。

#include <iostream>
#include <ctime>
#include <cstdlib>

int main() {
    srand(time(NULL));
    std::cout << rand();

    return 0;
}

これにより、毎回異なるランダム シーケンスが生成されます。srand(time(NULL)) 行を削除すると、プログラムを実行するたびに同じ結果が得られます。

プログラムの開始時に srand(time(NULL)) を 1 回だけ呼び出す必要があります。

編集: C++ 11 には専用の「ランダム」ヘッダーがあることに言及するために投稿を編集するつもりです。これはまだ使用していないため、あまりコメントできませんが、読むことができますそれについてはこちら

http://www.cplusplus.com/reference/random/

于 2013-07-19T12:31:20.913 に答える