今日の雑記

生きることでいっぱいいっぱい

Cygwin 上でコンパイラ(gcc)に「-mno-cygwin」渡した時としなかった時の rand の実装の話

正直、環境による実装依存の話だと思うのだが。
言葉で説明するのは難しいんだけど、なんか「srand した直後に実行した rand の結果が似たような結果になる。」んですよね。
まあこんなソースで実験してみた。

#include <stdlib.h>

int main(int argc, char *argv[])
{
    int i, rnd;

    for(i = 0; i < 10; i++){
        rnd = (int)time(NULL) + i;
        srand(rnd);
        printf("rand:%08d,%d\n", rnd, rand());
    }

    return 0;
}

これを試したマシン環境。

どんだけ PentiumIII が好きなんだ...、という話はともかく。
コンパイルオプションとかの具体的な何か。

gcc version 3.4.4 (cygming special, gdc 0.12, using dmd 0.125)
gcc -mno-cygwin -ansi -pedantic -o randtest.exe randtest.c

出た結果。

rand:1173298252,1729
rand:1173298253,1732
rand:1173298254,1736
rand:1173298255,1739
rand:1173298256,1742
rand:1173298257,1745
rand:1173298258,1749
rand:1173298259,1752
rand:1173298260,1755
rand:1173298261,1758

見たら解ると思うけど、seed が 1 増えるたびに rand 値が 3 づつ増えてる。
そこで、コンパイルオプションをこうしてみた。

gcc -ansi -pedantic -o randtest.exe randtest.c

そんで出た結果。

rand:1173298506,2085126557
rand:1173298507,1419408843
rand:1173298508,753691128
rand:1173298509,87973413
rand:1173298510,1569739347
rand:1173298511,904021632
rand:1173298512,238303917
rand:1173298513,1720069851
rand:1173298514,1054352136
rand:1173298515,388634421

うむむ。全く違う。この二つの実装の違いは何...?
実際使用する分には実害は少ないのでいいんだけど、なんとなく気になったというか。
他の実装とかだとどうなんだろう...?