3

ポアソンの到着に基づいて、ランダムな「hello world」関数を作成しようとしています。以下のコードでは、平均平均 (Lamda) が 5 であることを定義しています。また、経過時間が 1 秒から 5 秒であり、それを追跡したいと考えています。

オープンソース プロジェクトに基づくと、この画像のカモメはここここにありますが、同時にトラフィックがランダムに発生していることがわかります (私の場合は "hello world")。しかし、私の場合、ランダムなスリープ時間を取得しているだけですが、Hello World の数は同じです。

上記で使用したような画像に基づいて、どうすればアイデアを実現できますか。これは乱数発生器のポアソン分布を行う正しい方法ですか? クヌースに基づくポアソンのアルゴリズムを見た

助けてくれてありがとう..私の悪い英語でごめんなさい。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <limits.h>
#include <string.h>
#include <time.h>

int poisson(double lambda){
  int k=0;
  double L=exp(-lambda), p=1;
  do {
    ++k;
    p *= rand()/(double)INT_MAX;
  } while (p > L);
  return --k;
}

int main()
{
int i=0; 
int val=0;
time_t timer;
char buffer[25];
struct tm* val_time;



    /*For time= 0 until time=10*/
    for  (i=0; i<10; i++)
    {
    printf("Hello World\n");

    /*To print the time*/
    time(&timer);
    val_time = localtime(&timer);
    strftime(buffer, 25, "%Y:%m:%d%H:%M:%S", val_time);
    puts(buffer);

    sleep(poisson(2)); /*interarrival process*/
    }

}
4

2 に答える 2

1

INT_MAX が間違っていると思うので、次のようにします。

    p *= rand()/(double)RAND_MAX;

また、ループが 10 に制限されている限り、これ以上 hello を取得することはありません。あなたは何を期待していますか?

これが私の完全な C++11 (C ではない!) バージョンのプログラムです。

https://ideone.com/viZi3でライブを参照してください( IdeOne の明らかな時間制約のため、そこではソフトフェイルになることに注意してください)Time limit exceeded

#include <iostream>
#include <random>
#include <chrono>
#include <iomanip>

static std::mt19937 rng;
static std::poisson_distribution<int> poisson(2.0);

typedef std::chrono::high_resolution_clock Clock;
typedef std::chrono::time_point<Clock> Time;

int main()
{
    const Time finish_pole = Clock::now() + std::chrono::seconds(10);

    for (Time now = Clock::now(); now <= finish_pole; now = Clock::now())
    {
        std::cout << "Hello World\n";

        std::time_t now_c = Clock::to_time_t(now);
#if CXX11_SUPPORT_COMPLETE
        std::cout << std::put_time(std::localtime(&now_c), "%F %T") << std::endl;
#else
        char buffer[25];
        strftime(buffer, 25, "%Y:%m:%d%H:%M:%S", localtime(&now_c));
        std::cout << buffer << std::endl;
#endif

        sleep(poisson(rng)); /*interarrival process*/
    }

}
于 2011-11-30T20:19:59.087 に答える
1

コードを考えると、メッセージは常に 10 回出力されます。ループの開始時に合計時間が経過したかどうかを確認し、経過した場合はループを中断する必要があるようです。アイデアを与えるには:

time_t before, timer;
...
time(&before);
for (...) {
    time(&timer);
    if (time - before > timeout) {
         break;
    }
    before = timer;
    ...
}
于 2011-11-30T20:17:47.893 に答える