Skip to main content

5 posts tagged with "Random"

View All Tags

Excel VBA: 指定した行、列内のテーブルのセルに乱数を格納

· 2 min read
Yu Sasaki
Enterprise Security Manager / Advisor

excel_vba_random_cells 今回のネタは乱数でサンプルデータを生成したいときなどに使えますかね。

ソースコード

Sub randloop()
Randomize ' シードの設定(引数省略でシステムタイマーの値)
Const GYO_S As Integer = 1 ' 開始行
Const RETSU_S As Integer = 1 ' 開始列
Const GYO_E As Integer = 10 ' 終了行
Const RETSU_E As Integer = 5 ' 終了列
Const UPPER As Integer = 100 ' 乱数の最大値
Const LOWER As Integer = 0 ' 乱数の最小値
' 指定された行、列のテーブル内のセルに乱数を格納
For i = GYO_S To GYO_E
For j = RETSU_S To RETSU_E
' Rndは[0, 1)の範囲の値を返す
Cells(i, j).Value = Int((UPPER - LOWER + 1) * Rnd + LOWER)
Next j
Next i
End Sub

実行結果は上図のように0~100の範囲の乱数(今回は整数)が格納されます。 上記のコードの要の式は

(upper - lower + 1) * Rnd + lower

です。簡単に意味を説明しますと括弧内の+1はRndの戻り値の範囲が1未満の為の補正で、式の最後の+lowerはRndの戻りが0の場合の補正、と捉えます。

参考サイト

  • VBA World : 乱数の発生(関数:Rnd) その1

Rで統計: ヒストグラムの描画 - hist()関数

· 2 min read
Yu Sasaki
Enterprise Security Manager / Advisor

使用データは、ある30点満点のテストの20人分です。

19, 28, 4, 23, 8, 7, 20, 8, 12, 22, 19, 18, 14, 13, 13, 25, 12, 16, 11, 26

プロンプト

hist()関数の引数にベクトル変数を代入することでヒストグラムを描画できます。

> test <- c(19, 28, 4, 23, 8, 7, 20, 8, 12, 22, 19, 18, 14, 13, 13, 25, 12, 16, 11, 26)
> hist(test)
>

実行結果

30点満点テスト20人分の成績のヒストグラム

横軸が階級値で縦軸が度数(階級に入るデータ数)です。例えば、15**<x≦**20点の範囲の人が5人いる、と読めます。ただし、左端の0点データは0~5の階級に入ります。ここでは範囲の境界に注意しましょう(主に私が)。

データ作成に使用した乱数生成スクリプト

>>> import random
>>> [random.randint(0, 30) for i in range(20)]
[19, 28, 4, 23, 8, 7, 20, 8, 12, 22, 19, 18, 14, 13, 13, 25, 12, 16, 11, 26]
>>>

つい最近慣れ始めたPythonで書いてしまいました。リスト内包表記が地味に便利なところです。リスト内包表記についてはこちらをご覧ください。→Python: リスト内包表記をfor文に書き換える

そして、乱数モジュールの使い方に関してはこちらを、→Python: 乱数の生成 - random()、randint()、uniform()、seed()メソッド

また、重複のない乱数を生成するスクリプトはこちらをご覧ください。→Python: モジュールにテスト関数を定義 - 重複のない乱数(整数MIN以上MAX以下)の生成

Python: モジュールにテスト関数を定義 - 重複のない乱数(整数MIN以上MAX以下)の生成

· 2 min read
Yu Sasaki
Enterprise Security Manager / Advisor

ソースコード

#!/usr/bin/python
# coding: UTF-8
import random
def make_randint_list(min, max, cnt, sortflag=False, revflag=False):
"""
重複のない乱数(整数min以上max以下)を要素としたリストを返す
"""
list = []
i = 0
while cnt != i:
r = random.randint(min, max)
try:
list.index(r) # 既にリストに存在するか
except ValueError, e:
list.append(r) # 無い場合はリストに格納
i = i + 1
if (sortflag): list.sort(reverse=revflag)
return list
def _main():
"""モジュールのチェック関数"""
print 'makerand0.py [_main()]'
print make_randint_list(10, 99, 10)
print make_randint_list(10, 99, 10, True) # 昇順ソート
print make_randint_list(10, 99, 10, True, True) # 降順ソート
if __name__ == '__main__' : _main()
#

モジュール変数__name__の中には通常はモジュール名が入っています。しかし、このモジュールファイルを直接実行した場合は__name__に'__main__'という名前が入ります。その為、if __name__ == '__main__' : は真となり_main()が実行されます。

実行結果

$ python makerand0.py
makerand0.py [_main()]
[62, 18, 55, 44, 97, 67, 87, 16, 59, 43]
[11, 13, 30, 42, 46, 52, 71, 75, 81, 92]
[88, 81, 65, 60, 57, 53, 41, 34, 27, 23]

モジュールテスト用スクリプト

makerand0_test.py

#!/usr/bin/python
# coding: UTF-8
from makerand import make_randint_list
print make_randint_list(10, 99, 10)
print make_randint_list(10, 99, 10, True)
print make_randint_list(10, 99, 10, True, True)

実行結果

$ python makerand0_test.py
[52, 44, 63, 61, 50, 66, 88, 45, 99, 57]
[15, 26, 29, 53, 56, 69, 89, 91, 94, 95]
[96, 95, 93, 88, 79, 75, 64, 62, 33, 11]

リファレンス

チュートリアル

Python: 乱数の生成 - random()、randint()、uniform()、seed()メソッド

· 2 min read
Yu Sasaki
Enterprise Security Manager / Advisor

ソースコード

#!/usr/bin/python
# coding: UTF-8
# 乱数の生成 | random()、randint()、uniform()、seed()メソッドの使い方
import random # モジュールのインポート
print random.random(), 'n' # 0.0 ≦ F < 1.0 の浮動小数点数をランダムに返す
# randint(x, y)メソッド: 整数x以上y以下(x ≦ N ≦ y)の乱数を返す
for i in range(10):
print random.randint(10, 20), ' ',
print 'n'
# uniform(x, y)メソッド: 実数x以上y未満(x ≦ N < y)の乱数を返す
for i in range(10):
print random.uniform(10, 20)
print
# seed()メソッド: 乱数の種の初期化
# (省略した場合はシステムの現在時刻で初期化が行われる)
random.seed(1) # 明示的に初期化
for i in range(10):
print random.randint(10, 20), ' ',
print 'n'
random.seed(1) # もう一度初期化(結果は上と同じとなる)
for i in range(10):
print random.randint(10, 20), ' ',
print 'n'

実行結果

0.610071743263
16 16 15 11 19 16 10 11 20 18
12.8745815718
10.3223430071
10.9674507421
17.5459589302
16.0796539779
15.0854025011
18.6344006559
11.049275088
16.6396732404
12.0720922586
11 19 18 12 15 14 17 18 11 10
11 19 18 12 15 14 17 18 11 10

リファレンス

C++でMIN以上MAX未満の乱数を生成

· One min read
Yu Sasaki
Enterprise Security Manager / Advisor

ソースコード

#include <ctime> // for time()
#include <cstdlib> // for srand(), rand()
#include <iostream>
using namespace std;
#define MIN 10
#define MAX 21
int main()
{
srand(time(NULL)); // 現在時刻を乱数の種の設定
int lucky = MIN + rand() % (MAX - MIN); // MIN以上MAX未満の乱数を生成
cout < < "生成した乱数は" << lucky << "です。n";
for (int i = 0; i< 100; i++) { // 100個生成
cout << MIN + rand() % (MAX - MIN) << " ";
}
return 0;
}