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

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS