HSP の rnd を再現

HSP の rnd 関数の実装は以下のようになっています。( OpenHSP trunc/hsp3/hsp3int.cpp#L493

ival = code_geti();
if ( ival == 0 ) throw HSPERR_DIVIDED_BY_ZERO;
reffunc_intfunc_ivalue = rand()%ival;

C の標準ライブラリの rand の値を引数の値で剰余しているだけですね。

HSP は VC++ でビルドされています。 VC++ の rand の実装は 良い乱数・悪い乱数 に掲載されています。

ということで、HSP の rnd を再現してみると以下のような感じ。

#module
#defcfunc rnd2 int a
    x = x * 214013 + 2531011
    return ((x>>16)&32767)\a
#deffunc randomize2 int a
    x = a
    return
#global

randomize 12345
randomize2 12345

repeat 10
    mes ""+rnd(1000)+", "+rnd2(1000)
loop

結果も同じですね。

584, 584
164, 164
795, 795
125, 125
828, 828
405, 405
477, 477
413, 413
72, 72
404, 404

インフォメーション

公開日時
2008年3月28日 午後1時30分59秒
最終更新日時
2008年3月28日 午後1時32分17秒
カテゴリ
HSP