SlideShare a Scribd company logo
1 of 27
cp-15. 疑似乱数と
シミュレーション
(C プログラミング入門)
URL: https://www.kkaneko.jp/pro/adp/index.html
1
金子邦彦
内容
例題1.疑似乱数
例題2.ランダムウオーク
例題3.じゃんけんゲーム
例題4.モンテカルロ法による数値積分
2
目標
• 疑似乱数を使ったプログラムを理解する
• 疑似乱数を使ったシミュレーションを理解する
3
例題1.疑似乱数
• 疑似乱数を表示するプログラムを作る.
• 疑似乱数の表示を,10回繰り返すこと
• 疑似乱数を発生させるために,srand 関数と rand
関数を使うこと.
4
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#pragma warning(disable:4996)
int main()
{
int i;
int x;
srand( (unsigned int) time(NULL) );
for ( i = 0; i < 10; i++ ) {
x = ( (double)rand() / (RAND_MAX+1) ) * 10;
printf( "x=%dn", x );
}
return 0;
}
疑似乱数のシード
の設定
疑似乱数の発生
5
実行結果例
x=3
x=1
x=8
x=8
x=4
x=3
x=4
x=1
x=6
x=1 6
疑似乱数
i = 0
i < 10
x = ( (double)rand() / (RAND_MAX+1) ) * 10;
printf( "x=%dn", x );
i++
Yes
No
srand( (unsigned int) time(NULL) );
7
プログラムとデータ
メモリ
X = ( (double)rand() / (RAND_MAX+1) ) * 10;
x
①
疑似乱数の発生
printf( "x=%dn", x );
②
表示
8
疑似乱数
• rand 関数は疑似乱数(pseudo-random number)
を発生させるためのライブラリ関数.
• 発生される数は,0からRAND_MAXの間の値をと
る.
• RAND_MAX は,rand 関数で発生する疑似乱数
(pseudo-random number)の最大値を表す
9
疑似乱数のシード(seed)
• srand 関数は,rand 関数で発生させる疑似乱数
(pseudo-random number)の系列を設定するた
めのライブラリ関数.
• 疑似乱数の系列は,srand 関数の引数 seed によっ
て変化する.
• rand 関数は,シードの設定を行わないと,同じ系
列の疑似乱数を返す.
10
疑似乱数のまとめ
• srand 関数,rand 関数の使用では,
#include <stdlib.h> が必要
• rand 関数: 疑似乱数の発生
• 疑似乱数の範囲: 0からRAND_MAX
• 疑似乱数の型: 整数データ
• rand関数を実行するたびに,新しい疑似乱数が返される
• srand 関数
• rand 関数は,ある決められた初期値(「シード」という)から,
疑似乱数を計算する
• プログラムの実行のたびに,シードを変えて,違う疑似乱数
を発生させるために,srand 関数を用いる
11
例題2.ランダムウオーク
• ランダムウオークのプログラムを作る.
• 「酔っ払い」が歩いている
• 「酔っ払い」には記憶がない
• 「酔っ払い」は確率0.5で右に,確率0.5で左に歩
く
• 道の幅は11メートル,1歩は1メートルとし,
最初,酔っ払いは道の中央にいる.道幅を超えた
ら終わり
12
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#pragma warning(disable:4996)
void print( int n )
{
int i;
for ( i = 0; i < n; i++ ) {
printf( " " );
}
printf( "*n" );
}
int main()
{
int n = 5;
srand( (unsigned int) time(NULL) );
while ( ( n >= 0 ) && ( n <= 10 ) ) {
print( n );
if ( ( (double)rand() / (RAND_MAX+1) ) < 0.5 ) {
n++;
} else {
n--;
}
}
return 0;
}
疑似乱数のシード
の設定
疑似乱数の発生
13
実行結果例
*
*
*
*
*
*
*
*
*
* 14
道幅11メートル
0 1 2 3 4 5 6 7 8 9 10
15
課題1.ランダムウオーク結果集計
• 例題2の「ランダムウオーク」を1000回繰
り返して,「平均で何歩歩いたかを求めるプロ
グラム」を作りなさい
• 「小数付きのデータ」を扱うために、浮動小数
(double)を使うこと
• 各繰り返しにおいて 「n = 5;」を実行すること
16
例題3.じゃんけんゲーム
• じゃんけんを行うプログラム
0: パー
1: グー
2: チョキ
じゃんけんの勝負の判定のために,2次元配列を用
いる
17
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#pragma warning(disable:4996)
int main()
{
int x;
int y;
int hantei[3][3] = { {0, 1, -1}, {-1, 0, 1}, {1, -1, 0}};
char jk[3][20] ={ "パー", "グー", "チョキ" };
srand( (unsigned int) time(NULL) );
do {
y = ( (double) rand() / (RAND_MAX+1) ) * 3;
printf( "n" );
printf( "じゃんけん (0:%s,1:%s,2:%s,3:やめる)n", jk[0], jk[1], jk[2] );
scanf( "%d", &x );
switch ( hantei[x][y] ) {
case 1:
printf( "あなた: %s, 私: %s, あなたの勝ち!うう悔しいn", jk[x], jk[y] );
break;
case 0:
printf( "あなた: %s, 私: %s, ひきわけ.もう1度勝負!n", jk[x], jk[y] );
break;
case -1:
printf( "あなた: %s, 私: %s, 私の勝ち!やったあn", jk[x], jk[y] );
break;
}
} while ( x!= 3 );
return 0;
}
疑似乱数のシード
の設定
疑似乱数の発生
18
課題2.じゃんけん結果集計
• 例題3の「じゃんけんプログラム」につい
て,入力されたパー,グー,チョキの回数
に関する情報を表示するプログラムを作り
なさい
1. パーの次にパー
2. パーの次にグー
3. パーの次にチョキ
4. グーの次にパー
5. グーの次にグー
6. グーの次にチョキ
7. チョキの次にパー
8. チョキの次にグー
9. チョキの次にチョキ
19
例題4.モンテカルロ法による
数値積分
• モンテカルロ法による数値積分を行うプログラ
ムを書く
• 次の値を読み込むこと
• 積分区間[a,b]
• 疑似乱数の発生回数
• 数値積分を行うべき f(x) は,指数関数 exp(-x)
とする (プログラム中に書く)
20
モンテカルロ法とは
• モンテカルロ法は,疑似乱数を用いて積分近似値を求める
• 積分区間[a,b]で f(x) の値が0以上で,かつある値Ymax以下であ
ることが分かっているとき(下図),
1.ランダムな座標の発生(疑似乱数を利用)
a≦x≦b,0≦y≦Ymaxの範囲内でランダムな座標(x,y)を発生
2.関数 f(x) 以下であるのかの判定
関数f(x)以下である座標が総数に占める割合を求める
以上で,矩形の面積(b-a)*Ymaxに乗じることで積分近似値を求める
a b
x
y
Ymax
f(x)
0
21
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
double f(double x)
{
return exp(-x*x);
}
22
main()
{
double Ymax = 1.0;
double a, b, x, y, S;
int i, N, seed, count;
printf("積分区間(a~b) : ");
printf("a= ? ");
scanf("%lf", &a);
printf("b= ? ");
scanf("%lf", &b);
printf("疑似乱数の発生回数 N : ");
printf("N= ? ");
scanf("%d", &N);
積分区間 a, b の読み込み
疑似乱数の発生回数
の読み込み
23
srand( (unsigned int) time(NULL) );
count = 0;
for(i = 0 ; i < N ; i++){
x = (double)rand() / (RAND_MAX+1) * (b - a) + a;
y = (double)rand() / (RAND_MAX+1) * Ymax;
if(y < f(x)) {
count++;
}
}
S = (b - a) * Ymax * count / N;
printf("面積 = %lfn",S);
} 積分値の計算
ランダムな座標値
(x, y) の発生
関数 f(x) 以下であるのかの判定
24
実行結果の例
f(x) = exp(-x )
2
積分範囲(a~b) : 0 1
乱数の個数 : 1000
乱数の種 : 0
面積 = 0.761000
積分範囲(a~b) : 0 1
乱数の個数 : 1000000
乱数の種 : 0
面積 = 0.747537
積分範囲(a~b) : 0 1
乱数の個数 : 1000000000
乱数の種 : 0
面積 = 0.746825
25
課題3.円周率の計算
モンテカルロ法を用いて,円周率を求めなさい
26
課題3のヒント
0 1
1
① ランダムな座標値
(x, y) をこの正方形内
で発生させる
② 発生させた座標値
がこの円内かどうかを
判定する
(円内である確率は,
π/4)
27

More Related Content

Similar to cp-15. 疑似乱数とシミュレーション

【Unity道場スペシャル 2017札幌】乱数完全マスター
【Unity道場スペシャル 2017札幌】乱数完全マスター 【Unity道場スペシャル 2017札幌】乱数完全マスター
【Unity道場スペシャル 2017札幌】乱数完全マスター Unity Technologies Japan K.K.
 
第四回 JavaScriptから始めるプログラミング2016
第四回 JavaScriptから始めるプログラミング2016第四回 JavaScriptから始めるプログラミング2016
第四回 JavaScriptから始めるプログラミング2016kyoto university
 
【Unity道場スペシャル 2017京都】乱数完全マスター 京都編
【Unity道場スペシャル 2017京都】乱数完全マスター 京都編【Unity道場スペシャル 2017京都】乱数完全マスター 京都編
【Unity道場スペシャル 2017京都】乱数完全マスター 京都編Unity Technologies Japan K.K.
 
C++ tips 3 カンマ演算子編
C++ tips 3 カンマ演算子編C++ tips 3 カンマ演算子編
C++ tips 3 カンマ演算子編道化師 堂華
 
競技プログラミングのためのC++入門
競技プログラミングのためのC++入門競技プログラミングのためのC++入門
競技プログラミングのためのC++入門natrium11321
 
(ゲームじゃない方の)switchで遊びたい話
(ゲームじゃない方の)switchで遊びたい話(ゲームじゃない方の)switchで遊びたい話
(ゲームじゃない方の)switchで遊びたい話Masanori Masui
 
C++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISるC++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISるHideyuki Tanaka
 
Tokyo.R #19 発表資料 「Rで色々やってみました」
Tokyo.R #19 発表資料 「Rで色々やってみました」Tokyo.R #19 発表資料 「Rで色々やってみました」
Tokyo.R #19 発表資料 「Rで色々やってみました」Masayuki Isobe
 
Python standard 2022 Spring
Python standard 2022 SpringPython standard 2022 Spring
Python standard 2022 Springanyakichi
 
RでGISハンズオンセッション
RでGISハンズオンセッションRでGISハンズオンセッション
RでGISハンズオンセッションarctic_tern265
 
中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexprGenya Murakami
 
データサイエンスワールドからC++を眺めてみる
データサイエンスワールドからC++を眺めてみるデータサイエンスワールドからC++を眺めてみる
データサイエンスワールドからC++を眺めてみるShintaro Fukushima
 
C++ マルチスレッドプログラミング
C++ マルチスレッドプログラミングC++ マルチスレッドプログラミング
C++ マルチスレッドプログラミングKohsuke Yuasa
 
プログラミング技法特論第8回
プログラミング技法特論第8回プログラミング技法特論第8回
プログラミング技法特論第8回Noritada Shimizu
 
Clojure programming-chapter-2
Clojure programming-chapter-2Clojure programming-chapter-2
Clojure programming-chapter-2Masao Kato
 

Similar to cp-15. 疑似乱数とシミュレーション (20)

Sencha study
Sencha studySencha study
Sencha study
 
ji-2. 計算
ji-2. 計算ji-2. 計算
ji-2. 計算
 
【Unity道場スペシャル 2017札幌】乱数完全マスター
【Unity道場スペシャル 2017札幌】乱数完全マスター 【Unity道場スペシャル 2017札幌】乱数完全マスター
【Unity道場スペシャル 2017札幌】乱数完全マスター
 
第四回 JavaScriptから始めるプログラミング2016
第四回 JavaScriptから始めるプログラミング2016第四回 JavaScriptから始めるプログラミング2016
第四回 JavaScriptから始めるプログラミング2016
 
【Unity道場スペシャル 2017京都】乱数完全マスター 京都編
【Unity道場スペシャル 2017京都】乱数完全マスター 京都編【Unity道場スペシャル 2017京都】乱数完全マスター 京都編
【Unity道場スペシャル 2017京都】乱数完全マスター 京都編
 
C++ tips 3 カンマ演算子編
C++ tips 3 カンマ演算子編C++ tips 3 カンマ演算子編
C++ tips 3 カンマ演算子編
 
競技プログラミングのためのC++入門
競技プログラミングのためのC++入門競技プログラミングのためのC++入門
競技プログラミングのためのC++入門
 
2012 ce116 crowbar_snct_shirai
2012 ce116 crowbar_snct_shirai2012 ce116 crowbar_snct_shirai
2012 ce116 crowbar_snct_shirai
 
(ゲームじゃない方の)switchで遊びたい話
(ゲームじゃない方の)switchで遊びたい話(ゲームじゃない方の)switchで遊びたい話
(ゲームじゃない方の)switchで遊びたい話
 
C++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISるC++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISる
 
Tokyo.R #19 発表資料 「Rで色々やってみました」
Tokyo.R #19 発表資料 「Rで色々やってみました」Tokyo.R #19 発表資料 「Rで色々やってみました」
Tokyo.R #19 発表資料 「Rで色々やってみました」
 
Python standard 2022 Spring
Python standard 2022 SpringPython standard 2022 Spring
Python standard 2022 Spring
 
講座C入門
講座C入門講座C入門
講座C入門
 
RでGISハンズオンセッション
RでGISハンズオンセッションRでGISハンズオンセッション
RでGISハンズオンセッション
 
中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr
 
データサイエンスワールドからC++を眺めてみる
データサイエンスワールドからC++を眺めてみるデータサイエンスワールドからC++を眺めてみる
データサイエンスワールドからC++を眺めてみる
 
ACPC2016Day3:C問題
ACPC2016Day3:C問題ACPC2016Day3:C問題
ACPC2016Day3:C問題
 
C++ マルチスレッドプログラミング
C++ マルチスレッドプログラミングC++ マルチスレッドプログラミング
C++ マルチスレッドプログラミング
 
プログラミング技法特論第8回
プログラミング技法特論第8回プログラミング技法特論第8回
プログラミング技法特論第8回
 
Clojure programming-chapter-2
Clojure programming-chapter-2Clojure programming-chapter-2
Clojure programming-chapter-2
 

More from kunihikokaneko1

cs-8. 表計算ソフトウエアを用いたデータの扱い
cs-8. 表計算ソフトウエアを用いたデータの扱い cs-8. 表計算ソフトウエアを用いたデータの扱い
cs-8. 表計算ソフトウエアを用いたデータの扱い kunihikokaneko1
 
cs-7. 乱数,シミュレーション
cs-7. 乱数,シミュレーション  cs-7. 乱数,シミュレーション
cs-7. 乱数,シミュレーション kunihikokaneko1
 
cs-6. データベースとデータサイエンス
cs-6. データベースとデータサイエンスcs-6. データベースとデータサイエンス
cs-6. データベースとデータサイエンスkunihikokaneko1
 
cs-5. 人工知能の概要
cs-5. 人工知能の概要 cs-5. 人工知能の概要
cs-5. 人工知能の概要 kunihikokaneko1
 
cs-4. プログラミング入門
cs-4. プログラミング入門cs-4. プログラミング入門
cs-4. プログラミング入門kunihikokaneko1
 
cs-3. パノラマ画像,ストリートビュー,3次元コンピュータグラフィックス
cs-3. パノラマ画像,ストリートビュー,3次元コンピュータグラフィックスcs-3. パノラマ画像,ストリートビュー,3次元コンピュータグラフィックス
cs-3. パノラマ画像,ストリートビュー,3次元コンピュータグラフィックスkunihikokaneko1
 
cs-2. コンピュータによる画像制作,人工知能でできること,情報のコード化,デジタル画像,画素
cs-2. コンピュータによる画像制作,人工知能でできること,情報のコード化,デジタル画像,画素 cs-2. コンピュータによる画像制作,人工知能でできること,情報のコード化,デジタル画像,画素
cs-2. コンピュータによる画像制作,人工知能でできること,情報のコード化,デジタル画像,画素 kunihikokaneko1
 
cs-1. 無料ソフトウエア,無料データ,エコシステム,Scratch プログラミング,Scratch のキャラクタ
cs-1. 無料ソフトウエア,無料データ,エコシステム,Scratch プログラミング,Scratch のキャラクタcs-1. 無料ソフトウエア,無料データ,エコシステム,Scratch プログラミング,Scratch のキャラクタ
cs-1. 無料ソフトウエア,無料データ,エコシステム,Scratch プログラミング,Scratch のキャラクタkunihikokaneko1
 
mi-8. 人工知能とコンピュータビジョン
mi-8. 人工知能とコンピュータビジョンmi-8. 人工知能とコンピュータビジョン
mi-8. 人工知能とコンピュータビジョンkunihikokaneko1
 
mi-7. 学習と検証, 学習不足, 過学習, 学習曲線
mi-7. 学習と検証, 学習不足, 過学習, 学習曲線mi-7. 学習と検証, 学習不足, 過学習, 学習曲線
mi-7. 学習と検証, 学習不足, 過学習, 学習曲線kunihikokaneko1
 
mi-6. 画像分類システム
mi-6. 画像分類システムmi-6. 画像分類システム
mi-6. 画像分類システムkunihikokaneko1
 
mi-5. ディープラーニング
mi-5. ディープラーニングmi-5. ディープラーニング
mi-5. ディープラーニングkunihikokaneko1
 
mi-3. データサイエンス・AIの演習
mi-3. データサイエンス・AIの演習mi-3. データサイエンス・AIの演習
mi-3. データサイエンス・AIの演習kunihikokaneko1
 
mi-2. データサイエンス・AIの事例
mi-2. データサイエンス・AIの事例mi-2. データサイエンス・AIの事例
mi-2. データサイエンス・AIの事例kunihikokaneko1
 
mi-1. 人工知能の概要
mi-1. 人工知能の概要mi-1. 人工知能の概要
mi-1. 人工知能の概要kunihikokaneko1
 
Coding Standards of C++ について
 Coding Standards of C++ について  Coding Standards of C++ について
Coding Standards of C++ について kunihikokaneko1
 
co-3. サブクラス、継承
co-3. サブクラス、継承co-3. サブクラス、継承
co-3. サブクラス、継承kunihikokaneko1
 
co-2. メソッド定義と呼び出し
co-2. メソッド定義と呼び出しco-2. メソッド定義と呼び出し
co-2. メソッド定義と呼び出しkunihikokaneko1
 

More from kunihikokaneko1 (20)

cs-8. 表計算ソフトウエアを用いたデータの扱い
cs-8. 表計算ソフトウエアを用いたデータの扱い cs-8. 表計算ソフトウエアを用いたデータの扱い
cs-8. 表計算ソフトウエアを用いたデータの扱い
 
cs-7. 乱数,シミュレーション
cs-7. 乱数,シミュレーション  cs-7. 乱数,シミュレーション
cs-7. 乱数,シミュレーション
 
cs-6. データベースとデータサイエンス
cs-6. データベースとデータサイエンスcs-6. データベースとデータサイエンス
cs-6. データベースとデータサイエンス
 
cs-5. 人工知能の概要
cs-5. 人工知能の概要 cs-5. 人工知能の概要
cs-5. 人工知能の概要
 
cs-4. プログラミング入門
cs-4. プログラミング入門cs-4. プログラミング入門
cs-4. プログラミング入門
 
cs-3. パノラマ画像,ストリートビュー,3次元コンピュータグラフィックス
cs-3. パノラマ画像,ストリートビュー,3次元コンピュータグラフィックスcs-3. パノラマ画像,ストリートビュー,3次元コンピュータグラフィックス
cs-3. パノラマ画像,ストリートビュー,3次元コンピュータグラフィックス
 
cs-2. コンピュータによる画像制作,人工知能でできること,情報のコード化,デジタル画像,画素
cs-2. コンピュータによる画像制作,人工知能でできること,情報のコード化,デジタル画像,画素 cs-2. コンピュータによる画像制作,人工知能でできること,情報のコード化,デジタル画像,画素
cs-2. コンピュータによる画像制作,人工知能でできること,情報のコード化,デジタル画像,画素
 
cs-1. 無料ソフトウエア,無料データ,エコシステム,Scratch プログラミング,Scratch のキャラクタ
cs-1. 無料ソフトウエア,無料データ,エコシステム,Scratch プログラミング,Scratch のキャラクタcs-1. 無料ソフトウエア,無料データ,エコシステム,Scratch プログラミング,Scratch のキャラクタ
cs-1. 無料ソフトウエア,無料データ,エコシステム,Scratch プログラミング,Scratch のキャラクタ
 
mi-8. 人工知能とコンピュータビジョン
mi-8. 人工知能とコンピュータビジョンmi-8. 人工知能とコンピュータビジョン
mi-8. 人工知能とコンピュータビジョン
 
mi-7. 学習と検証, 学習不足, 過学習, 学習曲線
mi-7. 学習と検証, 学習不足, 過学習, 学習曲線mi-7. 学習と検証, 学習不足, 過学習, 学習曲線
mi-7. 学習と検証, 学習不足, 過学習, 学習曲線
 
mi-6. 画像分類システム
mi-6. 画像分類システムmi-6. 画像分類システム
mi-6. 画像分類システム
 
mi-5. ディープラーニング
mi-5. ディープラーニングmi-5. ディープラーニング
mi-5. ディープラーニング
 
mi-4. 機械学習
mi-4. 機械学習mi-4. 機械学習
mi-4. 機械学習
 
mi-3. データサイエンス・AIの演習
mi-3. データサイエンス・AIの演習mi-3. データサイエンス・AIの演習
mi-3. データサイエンス・AIの演習
 
mi-2. データサイエンス・AIの事例
mi-2. データサイエンス・AIの事例mi-2. データサイエンス・AIの事例
mi-2. データサイエンス・AIの事例
 
mi-1. 人工知能の概要
mi-1. 人工知能の概要mi-1. 人工知能の概要
mi-1. 人工知能の概要
 
kaneko202304.pptx
kaneko202304.pptxkaneko202304.pptx
kaneko202304.pptx
 
Coding Standards of C++ について
 Coding Standards of C++ について  Coding Standards of C++ について
Coding Standards of C++ について
 
co-3. サブクラス、継承
co-3. サブクラス、継承co-3. サブクラス、継承
co-3. サブクラス、継承
 
co-2. メソッド定義と呼び出し
co-2. メソッド定義と呼び出しco-2. メソッド定義と呼び出し
co-2. メソッド定義と呼び出し
 

cp-15. 疑似乱数とシミュレーション