MMF2 標準の「乱数」について
まず日本語版の訳だと Randomize が「任意抽出」になっているのだがこれは誤訳で、「乱数ジェネレータの初期化」( by MSDN )が正しい訳です。いきなり「任意抽出」ではヘルプを付けてないのに分かるわけないので注意。英語版ではちゃんと「 ramdomize 」と書いてあるから、乱数ジェネレータに新しいシード値を指定して初期化する関数の事だなということはすぐに分かる。
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 の各オブジェクトに自動で割り振られている「固定値」だって数値型の上限に達することがある。それが原因でトラブルを作ることはありえる、というか「クリックチーム動作コントローラ」でそのトラブルを実際に見たしそのバグはまだ治ってない。