irnd vWkZの場合。1行目のirnd命令で、変数vWKZには1〜1,000,000,000のいずれかの整数が入ります。で、次のand命令の800が問題なんですが、これを二進数表記に改めると1100100000になります。
and vWkZ,800
・同じ桁がどちらも1なら返り値のその桁は1。
・同じ桁のどちらか一方でも0ならば返り値のその桁は0。
2進数 10進数
1100100000 = 800
1000100000 = 544
1000000000 = 512
0100100000 = 288
0100000000 = 256
0000100000 = 32
0000000000 = 0
の7通りのどれかにしかなりません、絶対に。これがワンパターンに感じられた直接の理由かと思われます。厳密に言うと、ボクはVRMの乱数のランダムさ加減については未評価なので、乱数自体がプアな可能性も否定できませんが、少なくとも上記のことはロジックから結論できます。
0〜800の範囲でランダムな値を得たいのであれば、特にtetta氏のサンプルコードのようにフライスルーカメラの座標(本来float型)として用いるのであれば・・・
rnd vWkZとするのが正解。rnd命令で、変数vWkZに0〜1(厳密には0.9999・・・)のいずれかの小数が得られます。これに800をかけてやれば、0〜799.9999・・・・のいずれかの値が入ります。
mul vWkZ 800.0
0