乱数の例題(3) †さて、0.0 から 1.0 までの乱数は関数にしておいた方が便利だろう。そこで まずは、C のプログラムについて関数にしてみる。関数名は myrand() にしよう。 C 版 myrand †/* 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;
}
C++ 版 †さて、今の場合 program が短いので上記 C でも特に問題はない。しかし、 もし他の library と link する必要があって他でも myrand という名前が 使われていたらどうすればよいだろう? C では、お互い気をつけましょうとか名前のルールを別途定めましょうと言う しか手段は無い。ましてや rand という関数名は使えない。 一方 C++ の方は名前空間で分けるという手段がある。この 場合でも、名前空間の名前が一致してしまう可能性はあるが、関数名などと違って ずっと大きな範囲にすることができるので、名前の衝突回避は格段に楽になる。 関数名を rand にすることすらできる。以下にその例を示そう。 /* 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;
}
|