0

gccコンパイラを使用して、getpid()とgettimeofday()のみを使用して乱数ジェネレータを実装しています。これが私のコードです

#include <stdio.h>
#include <sys/time.h>
#include <sys/time.h>
#include <time.h>
#include <stdlib.h>

int main(int argc, char **argv)
{
    struct timeval tv;
    int count;
    int i;
    int INPUT_MAX =10;
    int NO_OF_SAMPLES =10;
    gettimeofday(&tv, NULL); 
    printf("Enter Max: \n");
    scanf("%d", &INPUT_MAX);
    printf("Enter No. of samples needed: \n");
    scanf("%d", &NO_OF_SAMPLES);
    /*printf("%ld\n",tv.tv_usec);
    printf("PID  :%d\n", getpid());*/
    for (count = 0; count< NO_OF_SAMPLES; count++) {
    printf("%ld\n", (getpid() * tv.tv_usec) % INPUT_MAX + 1);
    for (i = 0; i < 1000000; ++i)
    {
        /* code */
    }
    }
    return 0;
}

遅延の目的で内部forループを指定しましたが、取得する結果は常に同じです。このような

./a.out 
Enter Max: 
10
Enter No. of samples needed: 
10
1
1
1
1
1
1
1
1
1
1

Plzは私が間違っていることを私に訂正しますか?

4

2 に答える 2

1

gettimeofday をループに入れます。getpid() が INPUT_MAX + 1 で割り切れるかどうかを確認すると、常に同じ答えが得られます。代わりに、tv.tv_usec に getpid() (意味はありませんが ()) を追加できます。

于 2013-01-14T11:27:28.770 に答える
1

getpid()プログラムの実行中は定数であるため、定数値も得られます。

ただしgettimeofday()、ループ内で使用しても、これはおそらく役に立ちません。

  1. gcc はおそらく遅延ループを最適化します。
  2. 最適化されていなくても、遅延は非常に似ており、値はあまりランダムではありません。

より多くの乱数を生成する簡単な方法については、「線形合同ジェネレーター」を調べることをお勧めします。

于 2013-01-14T07:42:20.500 に答える