Random:擬似乱数を生成する

MMF2 標準の「乱数」について

まず日本語版の訳だと Randomize が「任意抽出」になっているのだがこれは誤訳で、「乱数ジェネレータの初期化」( by MSDN )が正しい訳です。いきなり「任意抽出」ではヘルプを付けてないのに分かるわけないので注意。英語版ではちゃんと「 ramdomize 」と書いてあるから、乱数ジェネレータに新しいシード値を指定して初期化する関数の事だなということはすぐに分かる。

英語版のramdomize

英語版のシード値の変更

日本語版の訳

日本語版の訳

tip_random01jp

MMF2 の標準だと「 random(数値) 」で得られる最小値は 0 になってる。例えば「 random(4) 」とした場合、「 0, 1, 2, 3 」の四つの数字のうちどれかが返ってくる。だからこういう書き方ができない(あるいは意味が無い、斜め上に返ってくる)ので注意。

  • random(-1)
  • random(0)
  • random(1)

random(0) と random(1) は必ず「 0 」が返ってくるのは上記説明の通り MMF2 の標準 Random 命令の仕様。始値が「 0 」を含めるので random(1) と指定しても「 0 」しか返さない。random(0) は論外ということになる。

ちょっとややこしいのが random(-1) の場合で「 unsigned int の最大値までの値」が得られる。つまり「 0 ~ 65535 」を上限とした値が返ってくるはず。

参考URL: BohYoh.com-C/C++ FAQ 整数型が表現できる値の範囲を教えてください。.

最小値 最大値 C C99 C++
char CHAR_MIN 0 CHAR_MAX UCHAR_MAX
SCHAR_MIN SCHAR_MAX
signed char SCHAR_MIN -127 SCHAR_MAX +127
signed short int SHRT_MIN -32767 SHRT_MAX +32767
signed int INT_MIN -32767 INT_MAX +32767
signed long int LONG_MIN -2147483647 LONG_MAX +2147483647
signed long long int LLONG_MIN -9223372036854775807 LLONG_MAX +9223372036854775807 × ×
unsigned char 0 UCHAR_MAX 255
unsigned short int 0 USHRT_MAX 65535
unsigned int 0 UINT_MAX 65535
unsigned long int 0 ULONG_MAX 4294967295
unsigned long long int 0 ULLONG_MAX 18446744073709551615 × ×

??
ということは int を超える値( 65535 より上)を指定したらどうなるのでしょうか。この場合よくわからないのですが勝手に数字が丸められてしまうと思います。65535 より大きい値は指定しても普通に取得できないと思ったらよいと思います。

そしてこう考えることもできます。random 命令で扱える最大の数値は「 65535 」までだから、これ以上の値を取得する場合には random(-1) + random(-1) とすれば「 131070 」まで取得可能な最大値を増やせる。MMF2 の数値型変数が扱える最大値は Long 型だからこのやり方で通用するのは「 2147483647 」まで。しかし厳密には「 signed long int 型」だから MMF2 の仕様を逆手にとれば理屈で言えばこのやり方でマイナスの値も取得できる。もちろんややこしいのでこういうことはやらない方が良い。なぜならばエクステンションごとにどういう数値の扱い方をしてるか分からないから。

MMF2 はオーサリングツールであり、操作にプログラム知識はいらない。でも実際は特定の各数値型の上限で動いているにすぎないので、慣れてきたら知識として「扱うことができる最大値、最小値」は意識した方が良い。例えば MMF2 の各オブジェクトに自動で割り振られている「固定値」だって数値型の上限に達することがある。それが原因でトラブルを作ることはありえる、というか「クリックチーム動作コントローラ」でそのトラブルを実際に見たしそのバグはまだ治ってない。