[[乱数の例題(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;
}