C99に対応した標準Cライブラリの実装レポートを行っていきます。

プロフィール 

Author:高木信尚

ホームページ
ブログ

最近の記事 

最近のコメント 

最近のトラックバック 

月別アーカイブ 

カテゴリー 

ブロとも申請フォーム 

この人とブロともになる

ホーム 全記事一覧 << 前の記事 次の記事 >>

 

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:0CM:0

コメント
コメントの投稿

管理者にだけ表示を許可する


トラックバック
トラックバックURLはこちら
http://libc.blog47.fc2.com/tb.php/68-b07d0752

ホーム 全記事一覧 << 前の記事 次の記事 >>

ブログ内検索 

お勧め書籍 

RSSフィード 

リンク 

このブログをリンクに追加する

Powered By FC2ブログ 

Powered By FC2ブログ
ブログやるならFC2ブログ

Copyright(C) 2006 TAKAGI Nobuhisa All rights reserved.
Powered by FC2ブログ. 無料ホームページ アフィリエイト レンタルサーバー FC2ブログ 一戸建て template designed by 遥かなるわらしべ長者への挑戦.