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