|
|
|
| 2008/10/07 11:41||▲
|
|
|
前回は擬似乱数の種を設定するsrand関数でしたので、今回は実際に擬似乱数を発生させるrand関数について書くことにします。
実際の関数の実装に先立って、擬似乱数として返す値の最大値を表す RAND_MAX マクロを定義する必要があります。このマクロの値は、ほとんどの処理系で32767ですので、今回の実装もそれにあわせることにします。
#define RAND_MAX 32767
次に、実際の関数の実装に入ります。rand関数は、srand関数のときに現れた静的変数 next を共有しますので、srand関数と同じ翻訳単位で定義する必要があります。あとは、擬似乱数の計算処理、より正確には next の更新処理の部分の排他制御が必要なのが特徴です。
int rand(void) { int loc = vsns_ini() || sns_loc(); if (!loc) loc_cpu();
next = next * 1103515245 + 12345; int result = (unsigned int)(next / 65536) % (RAND_MAX+1);
if (!loc) unl_cpu(); return result; }
擬似乱数の生成に使用する計算式は、標準規格の例と同じ単純なものです。擬似乱数の性能自体は対して高くありませんが、rand関数の用途の多くは、ちょっとした乱数が欲しいときに使うといったものでしょうから、これで十分です。
数値シミュレーションのようなものをH8で行うことがあるのかどうかは不明ですが、より高性能な擬似乱数が必要な場合は、アプリケーション側でM系乱数などのアルゴリズムを用いて、別途関数を作成することになると思います。
|
| 2006/06/12 13:32|一般ユーティリティ|TB:0|CM:0|▲
|
|
|
コメント
|
|
コメントの投稿
|
|
|
|
|
トラックバック
|
トラックバックURLはこちら
http://libc.blog47.fc2.com/tb.php/68-b07d0752
|
|
|
|
|
ホーム
全記事一覧
<< 前の記事
次の記事 >>
|