わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

乱数生成,CとVBAで

 いきなりですが問題です.

 1から6までの範囲で乱数を求めるコードを,CとVBAで書いてください.

 いちおう補足です.一様乱数でなくてかまいません.
 では解答です.

// C
rand() % 6 + 1
' VBA
Int(Rnd * 6) + 1

 解説です.Cでは標準ライブラリ関数のrandを使用するのがもっとも簡単です.「#include <stdlib.h>」を書いておく必要もあります.rand関数は引数をとりません.そのようなときは「rand()」と書いて呼び出します*1.戻り値の型はintですが,値は0以上*2となるのが保証されています.
 その戻り値に対し,0で割って余りを求め,1を加えています.順番に見ていくと,次のようになります.

rand() 0以上の整数
rand() % 6 0, 1, 2, 3, 4, 5のいずれか
rand() % 6 + 1 1, 2, 3, 4, 5, 6のいずれか

 次にVBAで乱数生成に使用できる関数はRndです.引数なしで書いて呼び出すことができ,その際には「()」も不要です.戻り値は,0以上1未満の実数値です.
 その戻り値に対し,6倍してから整数にして,1を加えています.Cと同じように順番に見ていきます.

Rnd 0以上1未満の実数
Rnd * 6 0以上6未満の実数
Int(Rnd * 6) 0, 1, 2, 3, 4, 5のいずれか
Int(Rnd * 6) + 1 1, 2, 3, 4, 5, 6のいずれか

 Intも,関数です.引数の整数部分を返します*3
 Cでは,rand関数の戻り値は整数型だったため,使用しませんでしたが,例えば(int)xと書くことで,変数xの整数部分*4を得ることができます.この「(int)」は演算子の一つ(キャスト演算子)です.変数xではなく式αの場合,(int)(α)と書きますが,αの前後のカッコは,演算対象を明確にするため*5のもので,関数呼び出しではありません.

*1:「rand」だけだと,関数のアドレスとなります.「printf("%p\n", rand);」で,アドレスを出力します.

*2:https://linuxjm.osdn.jp/html/LDP_man-pages/man3/rand.3.htmlによると「0 以上 RAND_MAX 以下 (略) の範囲の疑似乱数整数を返す」とあります.RAND_MAXはstdlib.hで定義されているオブジェクト形式マクロ(いわゆる定数)です.

*3:ただしInt(-2.5)は,-2ではなく-3です.引数の値を超えない最大の整数を返します.高校数学でガウス記号を学んだなら,Intはそれと同じことをする関数です.

*4:負の数のときも,整数部分です.(int)-2.5は,-2になります.

*5:演算子の優先順位に注意すると,(int)a[10]と(int)(a[10])は同じ(前者の書き方が好まれる)なのに対し,(int)x + 3と(int)(x + 3)は異なります---と書いてから,xの値が非負でオーバーフローなどが起こらないときは等しい値になることに気づきました.(int)x * 3と(int)(x * 3)は異なります.