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