/// 実習D8 制御文(For 〜Next) と乱数 | プログラミング実習 |
乱数と疑似乱数(ぎじらんすう)
乱数とは、ランダムに表れる数のこと。例えば、サイコロを振った時に出る目(出目という)は、今までの出目から予測することができないので、乱数といえる。
疑似乱数とは、計算によって作られる数のこと。計算方法がわかれば予測可能となる。
プログラミングで利用する乱数は、疑似乱数である。(以降、疑似乱数を乱数と示す。)
乱数は、次のような分野で利用されている。
関数の利用 | クラスの利用 |
Randomize() 乱数を初期化する。 Rnd() 0 以上、1 未満の値(Single型)を返す。 |
Dim rr As New System.Random() 乱数オブジェクトrrを作成する。 r = rr.Next 0以上の整数を返す。 |
プロジェクト名 実習D8乱数の生成1
動作
15個の乱数を生成する。(クラスを利用)
デザイン
フォームのプロパティ
Font.Size = 11
Size = 380, 360
テキストボックスのプロパティ
Multiline = True
複数行を扱えるようにする。
コード(プログラム) [終了ボタン]のメソッドは省略しています。
Public Class Form1
Private Sub btnRansuu_Click(sender As System.Object, e As System.EventArgs)
Handles btnRansuu.Click
Dim n, r As Integer
Dim rr As New System.Random() '乱数のオブジェクトを作成
tbxKekka. @ = ""
For n = A To B
r = rr.Next '乱数の生成
tbxKekka.Text = tbxKekka.Text & r.ToString & vbCrLf
C
End Sub
End Class
キーワード
vbCrLf…改行を表すデータ。
テスト
[乱数の生成]ボタンをクリックするたびに、異なる乱数が表示される。
実習D8乱数の生成1の変更
プログラムの下線部(RandomとNext)を次のように変更して実行したとき、結果を記録せよ。[乱数の生成]ボタンを何度かクリックして、表示される数を確認すること。
- (1) Random() → Random(10)、 Next → Next
- 何度クリックしても @ 同じ値が表示される。
- (2) Random(10) → Random()、 Next → Next(6)
- 表示される数字は、5と A 4と3と2と1と0 である。
- (3) Random() → Random()、 Next(6) → Next(1, 6)
- 表示される数字は、5と B 4と3と2と1 である。
動作
0〜9の10種類の乱数を生成し、それぞれの数が出る確率(出現率)を調べる。
デザイン
実習D8と同じ
コード(プログラム) [終了ボタン]のメソッドは省略しています。
実習D8のプログラムを作りかえる。
Public Class Form1
Private Sub btnRansuu_Click(sender As System.Object, e As System.EventArgs)
Handles btnRansuu.Click
Dim n, r, rcnt(9) As Integer, ritsu As Double
Dim kaisuu As Integer = 1000 '乱数生成の回数
Dim rr As New System.Random() '乱数のオブジェクトを作成
tbxKekka.Text = ""
For n = @ To A
rcnt(n) = 0 'カウント用配列の初期化
Next
For n = 1 To kaisuu
r = rr.Next( B ) '乱数の生成
rcnt(r) = C '乱数rの個数をカウント
Next
For n = D To E
ritsu = F * 100
tbxKekka.Text = tbxKekka.Text & n.ToString & "番="
tbxKekka.Text = tbxKekka.Text & rcnt(n).ToString & "回:"
tbxKekka.Text = tbxKekka.Text & ritsu.ToString & "%"
tbxKekka.Text = tbxKekka.Text & vbCrLf
Next
End Sub
End Class
キーワード
解説
どの数もほぼ同じ出現率(約10%)になる。発生回数を増やせば、より10%に近づく。
出現率(%) = 個別の回数÷全生成回数×100
プログラムで、0の回数が110回であったとき、出現率は110÷1000×100=11%。
テスト
[乱数の生成]ボタンをクリックすると回数と出現率が表示される。
動作
0〜9の10種類の乱数を生成し、それぞれの数が出る出現率を調べる。
ただし、0は19%、1と2は16%、3〜9は7%の出現率とする。
デザイン
実習D8と同じ
コード(プログラム) [終了ボタン]のメソッドは省略しています。
実習D8のプログラムを作りかえる。
Public Class Form1
Private Sub btnRansuu_Click(sender As System.Object, e As System.EventArgs)
Handles btnRansuu.Click
Dim n, r, rcnt(9) As Integer, ritsu As Double
Dim kaisuu As Integer = 10000 '乱数生成の回数
Dim rr As New System.Random()
'出現率設定用
Dim rset(100) As Integer = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, _
1, 1, 1, 1, 1, 1, 1, 0, 0, 0, _
2, 2, 2, 2, 2, 2, 2, 0, 0, 0, _
3, 3, 3, 3, 3, 3, 3, 0, 0, 0, _
4, 4, 4, 4, 4, 4, 4, 1, 1, 1, _
5, 5, 5, 5, 5, 5, 5, 1, 1, 1, _
6, 6, 6, 6, 6, 6, 6, 1, 1, 1, _
7, 7, 7, 7, 7, 7, 7, 2, 2, 2, _
8, 8, 8, 8, 8, 8, 8, 2, 2, 2, _
9, 9, 9, 9, 9, 9, 9, 2, 2, 2}
tbxKekka.Text = ""
For n = @
A 'カウント用配列の初期化
Next
For n = 1 To kaisuu
r = rr.Next(100)
rcnt(rset(r)) = rcnt(rset(r)) + 1 '乱数rの個数をカウント
Next
For n = 0 To 9
ritsu = B
tbxKekka.Text = tbxKekka.Text & n.ToString & "番="
tbxKekka.Text = tbxKekka.Text & rcnt(n).ToString & "回:"
tbxKekka.Text = tbxKekka.Text & ritsu.ToString & "%"
tbxKekka.Text = tbxKekka.Text & vbCrLf
Next
End Sub
End Class
キーワード
_(下線) … 次の行に命令が続いていることを示す。
解説
配列rsetの(0)〜(99)に0〜9のデータを格納している。0〜99の乱数を配列の添字にすることで配列に格納されている0〜9のデータが得られる。配列には0が19個、1と2は16個、3〜9は7個ずつ格納されている。これで出現率を設定している。配列1つ当たり1%になる。
テスト
実行すると、問題の出現率に近い値が表示される。
Memo
メソッドの引数にByValがない。VB2010 SP1以降、省略される。
Private Sub Btn1_Click(ByVal sender As System.Object, …) Handles Btn1.Click
Private Sub Btn1_Click(sender As System.Object, …) Handles Btn1.Click
変数の前にByValを付けると値渡し、ByRefを付けると参照渡しになる。省略するとByValとなる。
実習室のVBは2008なのでByValが自動的につけられる。
/// 実習D8 制御文(For 〜Next) と乱数 | Copyright©2014 Hiroshi Masuda |