[[乱数の例題(2)]] * 乱数の例題(3) [#j745b0af] さて、0.0 から 1.0 までの乱数は関数にしておいた方が便利だろう。そこで まずは、C のプログラムについて関数にしてみる。関数名は myrand() にしよう。 ** C 版 myrand [#ac94b7e3] /* randtest.c */ #include <stdio.h> #include <stdlib.h> #include <time.h> #define REPEAT_COUNT 100 double myrand() { return ((double)rand()) / ((double)RAND_MAX + 1.0); } int main() { int i; double r; srand((unsigned int)time(0)); for(i = 0; i < REPEAT_COUNT; i++) { r = myrand(); printf("%lf\n", r); } return 0; } さて、今の場合 program が短いので特に問題はない。しかし、もし他の library と link する必要があって他でも myrand という名前が使われていたらどうすればよい だろう? C では、お互い気をつけましょうとか名前のルールを別途定めましょうと言う しか手段は無い。一方 C++ の方は名前空間で分けるという手段がある。この ** C++ 版 [#kbcd668e] さて、今の場合 program が短いので上記 C でも特に問題はない。しかし、 もし他の library と link する必要があって他でも myrand という名前が 使われていたらどうすればよいだろう? C では、お互い気をつけましょうとか名前のルールを別途定めましょうと言う しか手段は無い。ましてや rand という関数名は使えない。 一方 C++ の方は名前空間で分けるという手段がある。この 場合でも、名前空間の名前が一致してしまう可能性はあるが、関数名などと違って ずっと大きな範囲にすることができるので、名前の衝突回避は格段に楽になる。 関数名を rand にすることすらできる。以下にその例を示そう。 ** C++ 版 [#kbcd668e] /* randtest.cpp */ #include <iostream> #include <cstdlib> #include <ctime> #define REPEAT_COUNT 100 namespace mylib { double rand() { return ((double)std::rand()) / ((double)RAND_MAX + 1.0); } } int main() { int i; double r; std::srand((unsigned int)std::time(0)); for(i = 0; i < REPEAT_COUNT; i++) { r = mylib::rand(); std::cout << r << std::endl; } return 0; }