|
/*========================================================*/ <<<あゆしゃのC言語プログラミング>>> /*========================================================*/ 第634回 乱数生成アルゴリズム 発行 2006年1月23日(月曜日) 発行数 約2500 {magclick} /*========================================================*/ はじめに ( 決り文句 ) /*========================================================*/ ・このメールマガジンは、主にまぐまぐさんから発行しています。 ・ジャンルは、マルチメディアのプログラム、C言語です。 ・横60文字で作成し、インデントは大抵半角スペース4つです。 ・ここで扱うプログラムは、C言語と半光年以内のものです。 ・登録解除は、メルマガのホームページでお願いします。 ・過去ログはバックナンバー(下欄参照)を活用して下さい。 ・内容は私が感じたもので、最新の技術も、へたれもあります。 ・わかりやすさを優先させる為、たまに嘘があるかもしれません。 /*========================================================*/ ご挨拶 /*========================================================*/ こんにちは、あゆしゃです。 お正月休みの間、ツタヤでDVDを借りました。 ハリーポッターとなんとかの囚人。 面白かったです。60点ぐらいでしょうか。 学校ものに共通する要素ですが、 1.ルールの中での共同生活が「安心」の要素をうみ、 2.だからこそ「行動と変化が」がおきる というのは、王道ですがよい流れだと思います。 このシリーズの場合は、「変化から行動」を経て学校に移り、 しかも「安心」が得られていないという、ちょっと変な流れには なっていますが、 マトリクスなど、前作を知らない人間を無視するのは最近の シリーズものの流行ですので、致し方ないところです。 {magclick} /*========================================================*/ 今回のお題 << 乱数生成アルゴリズム >> /*========================================================*/ 絵を、一枚描いてみました。 http://ayusya.hp.infoseek.co.jp/Image/ariahan.png ペイントブラシ1発書き10分による、アリアハンの風景です。 こういう風景を、マップパーツのデータから「自動演算」で 再現したいのです。 ★そして時速1000キロで走り回りたいのです! /*========================================================*/ ドラクエのマップは256*256です。 1マスを256メートルと定義し、最小ポリゴン1つあたりの サイズを4メートルと決めます。 演算済みの高さデータをすべてメモリ上においておくには、 size = (256*256/4)*(256*256/4)*4; // 1073741824バイト 1ギガバイトが必要です。 流石にそれだけのRAMを確保するのは現実的ではありません。 /*========================================================*/ そのため、高速なリアルタイム演算を考える必要があります。 そこで、乱数の登場です。 セルの位置を乱数の「種」として、そこから乱数を派生させれば それぞれのマスが異なる曲線を毎回同じように描く、 あたかも作りこまれたかのような多様性が表現できる、 気がします。 前回のマップを、そのように変えてみると、 マスの位置によって乱数を初期化 srand( i * 32 + j ); float x = ( float )i - 16; float z = ( float )j - 16; 初期化後の乱数によって、高さ決定 float y = ( float )rand() * 10 / 32768; 前回までのソースを、このように修正すると、 http://ayusya.hp.infoseek.co.jp/Image/DirectXSample_060123_1.png このようになります。 ・・・ ・・・・・・ ・・・・・・・・・これは、平面ですか? かろうじて傾いているようですが。。。 /*========================================================*/ そもそも、標準ライブラリの変数は、いい加減です。 それもそのはず、C言語のライブラリは、何十年も前に作られた ものです。まだ、乱数という技術が確立していなかった時代ですか ら、完璧でなくて、当然なのです。 というわけで、乱数生成ルーチンを作ってみましょう。 /*========================================================*/ というわけで、このページです。 http://ayusya.hp.infoseek.co.jp/AlgorithmRandom.html 以前紹介した、あゆしゃ製の乱数ライブラリです。 UINT arand( UINT r ) { r ^= 0x65AC9365 << ( r & 3 ); r ^= ( r >> 3 ) ^ ( r >> 4 ) ^ ( r << 3 ) ^ ( r << 4 ); return r; } 分散を均等にする魔法のキーワード「AC9365」でフリップ した後、むちゃくちゃにシフトしました。 これで、綺麗に分散する乱数を得られます。 http://ayusya.hp.infoseek.co.jp/Image/DirectXSample_060123_2.png ・・・ ・・・・・・ ・・・・・・・・・得られていませんね、おかしいなぁ。 /*========================================================*/ 実は、あゆしゃのアルゴリズムには完成版とそうでないものが あります。 完成版を使うと、 http://ayusya.hp.infoseek.co.jp/Image/DirectXSample_060123_3.png このように、見事に起伏します。 このアルゴリズムは特許申請する予定なので、サンプルとしては 公開できません。 困りました。 /*========================================================*/ ぱにぽに を読んで、精神統一した結果、ひらめきました。 /*========================================================*/ というわけで、以下のように修正します。 UINT arand( UINT r ) { r ^= 0x65AC9365 << ( r & 3 ); r ^= ( r >> 3 ) ^ ( r >> 4 ) ^ ( r << 3 ) ^ ( r << 4 ); r ^= 0x65AC9365 << ( r & 3 ); r ^= ( r >> 3 ) ^ ( r >> 4 ) ^ ( r << 3 ) ^ ( r << 4 ); r ^= 0x65AC9365 << ( r & 3 ); r ^= ( r >> 3 ) ^ ( r >> 4 ) ^ ( r << 3 ) ^ ( r << 4 ); return r; } 3つ重ねただけでお手軽、しかも、 http://ayusya.hp.infoseek.co.jp/Image/DirectXSample_060123_4.png すばらしい分布です。これで行きましょう。 {magclick} /*========================================================*/ さいごに /*========================================================*/ 今後の予定です。 1月16日月曜日 第631回 DX14 回転演算 済 1月18日水曜日 第632回 DX15 マップを移動する 済 1月20日金曜日 第633回 DX16 太陽を回す 済 1月23日月曜日 第634回 乱数生成アルゴリズム 済 1月25日水曜日 第635回 ドラクエ3のマップを得る 1月25日水曜日 第636回 高さ演算を作成する {magclick} /*========================================================*/ 次回予告 /*========================================================*/ 次回は1月25日(水曜日)に、第635回をお送りします。 お題は「ドラクエ3のマップを得る」 ドラクエのマップは画像で公開されています。 そこからマップチップデータを抽出するプログラムを作成して みましょう。 お楽しみに! /*========================================================*/ 最後の決り文句 /*========================================================*/ このメールマガジンは、まぐまぐさんから発行しています。 このメールマガジンを解除したい場合は、まぐまぐさんをご利用 ください。このメルマガのまぐまぐアイディーは最後にあります。 このメールマガジンには広告が挿入されていますか? このメールマガジンの内容に文面の引用はありませんか? めーらっくすの場合はめーらっくすの利用方に従ってください。 このメールマガジンの内容の、転用、流用、宣伝、リンク、 乱数魂 なんて大歓迎です。 {magclick} /*========================================================*/ /*========================================================*/ 発行者 あゆしゃ ホームページ::あゆしゃの世界 http://ayusya.hp.infoseek.co.jp/ ご意見・ご感想・ご質問メール mailto:ayusya@flamenco.plala.or.jp まぐまぐ::アイディー 0000020674 まぐまぐ::登録と解除 http://www.mag2.com/m/0000020674.htm まぐまぐ::バックナンバー http://jazz.tegami.com/backnumber/frame.cgi?id=0000020674 めーらっくす::アイディー MM3E1AEE285AB4F めーらっくす::登録と解除 http://www.mailux.com/mm_dsp.php?mm_id=MM3E1AEE285AB4F めーらっくす::バックナンバー★最近のものならこちらが便利★ http://www.mailux.com/mm_bno_list.php?mm_id=MM3E1AEE285AB4F |