![]() |
Top > 授業 > Delphi プログラミング >Lesson 6a Lesson 6a(2004/09/14) |
![]() |
![]() |
![]() |
![]() 1.Lesson 6 では乱数の利用の練習を目指します。(実は Lesson 7 も乱数ですが。) 2.この Lesson 6 では5つのサンプルプログラムを用意します。ただしそのうちの2つは、別のサンプルプログラムの練習問題の解答(例)になっています。そこで Lesson6 も、Lesson 5 と同様に a と b の2つに分けます。Lesson 6a の提出用の課題が終わってから Lesson 6 を見られるようにします。提出マーク[提出]のついた練習問題のプログラムを、前回同様、圧縮した上で高木までメールで送ってください。 3.Lesson 6 で扱う乱数はコンピュータシミュレーションの基礎になるものです。シミュレーションではほとんどの場合、乱数を使いますので、乱数には慣れてください。 4.サンプルプログラムを眺め、練習問題を試してください。 5.サンプルプログラムはダウンロードしてください(クリック)。ダウンロードしたファイル(lesson6a.exe)はDelphi7\Source に置いてクリックして解凍してください。 |
![]() a.このプログラムは発生させた乱数を memo 領域に書き出します ・書き出すのは10個の整数の乱数(1〜10)と、[0, 1.0]の乱数です。何れも一様乱数です。 b.乱数を発生させる関数 random ・Delphi では、乱数を与える関数 random が予め組み込まれています(普通はそうですが)。 ・random は値が[0, 1.0]の範囲の実数の乱数を発生させて返します。 ・random(n) (ただし n は正の整数) は 0, 1, …, n-1 の値をとる整数の乱数を発生させます。 ・関数 random/randon(n) を使う前に randomize 命令を使います。 ・関数 random/randon(n) が与えるのは一様乱数です。他の分布の乱数もこの一様乱数から作ることができます。詳しくはアルゴリズムの本を参照してください。 c.EndLoop(i) という論理型の変数を使って repeat … until 構文を使っています ・この種の論理型の変数の使い方も試してください。 練習問題 1.randomize 命令を削除するとどうなるかを確認せよ。(2度以上、プログラムを起動し直して結果を見ること。) 2.整数の乱数の値が1〜20、実数の乱数の値が [0.0, 10.0] なるように書き換えよ。 3.repeat … until の代わりに while 文を使ってプログラムを書き換えよ。 (以上、分からない点があれば高木まで連絡してください。この問題が分からないのは困ります。) |
![]() a.このプログラムは実数の乱数の度数分布をグラフに書き出しています ・値が[0, 1.0]の範囲の実数の乱数を 10000 回発生させ、0.1 刻みで度数分布を求めています。 ・値を 100 とるごとにグラフを描き換えています。つまりグラフは100回描き換わっています。実行が早いと視覚的には分からないと思います。 ・一様乱数の分布が確かに一様乱数であることを実感できればよいです。 ・プログラムが少し複雑なので、プログラムの各パートの意味をよく理解してください。 練習問題[提出]:標準正規分布に従う乱数の度数分布をグラフに描け → P603 ・標準正規分布とは、平均が0、分散が1の正規分布です。統計の本でその特性を確認しておくこと。 ・正規分布に従う乱数は正規乱数と呼びます。正規乱数を作る関数にはいくつかの方法があります。ダウンロードして解凍したファイルの中に、normal.pas というファイルがあります。この中に、正規乱数を与える、よく使われる関数が書いてあります。パラメータの m が平均(期待値)、s が標準偏差です。手続きTForm1.StartBtnClickの中にこの関数を貼り付けて使ってみてください。 ・私の解答例の実行例を、ダウンロードして解凍したファイルの中に入れておきます。P603.exe です。参考にしてください。 |
![]() ・P602 の練習問題の解答例です。 ・私が作った解答例は Lesson 6b で示します。 |
![]() a.このプログラムは、赤い●を PaintBox 内でランダムウォークさせます ・ランダムウォーク(random walk)とは「酔歩」とも言います。よくプログラムの例に使います。 b.酔歩の原理 ・P604 で使っている酔歩の原理は、手続きNewPositionにある次の3行で表せます。 theta := 2.0*Pi*random; Gxy[1,1] := Gxy[1,1] + Round(Wstep*Cos(theta)); Gxy[1,2] := Gxy[1,2] + Round(Wstep*Sin(theta)); 現在の位置を (Gxy[1,1], Gxy[1,2])として、まず乱数で次に進む方角(theta)をラジアンで決めます。次に、決めた方角に位置を Wstep だけ移動させます。 練習問題 1.P604 は●が移動するとその前の●を消すようにしてある。前の●をすべて残すようにプログラムを書き換えよ。 2.P604 は●が右/左/上/下に行き着くと左/右/下/上に抜けるようにしてある。PaintBox の境界に留まるようにプログラムを書き換えよ。 3.[提出]ダウンロードして解凍したファイルの中にある P605.exe と同様の動作をするプログラムを書け → P605 ・このプログラムはパチンコのシミュレーションです。横に何重にも釘を打って並べた空間の真ん中に1つずつ玉を落とします。玉は確率 0.5 で右か左に移動して次の層の釘に当たります。最後の釘に当たった後で下に落ちます。このようにして、最初の場所から玉が横にどのくらいずれるかをシミュレートしています。 ・このプログラムを書くのは難しいです。3日考えてできなければ、当面、諦めること。 |
![]() ・P604 の練習問題3の解答例です。 ・私が作った解答例は Lesson 6b で示します。 |
![]() まず、練習問題のうち[提出]指定のプログラムを高木に送ってください。その後に、その練習問題の解答例にあたるプログラムを Lesson 6b の掲示でダウンロードできるようにします。 |