HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2011
0312
玄冬randomizeのデフォルトの引数を取得する方法2解決


玄冬

リンク

2011/3/12(Sat) 11:10:38|NO.37546

randomizeのヘルプに書かれている

>p1を省略した場合は、 Windowsのタイマから得られた不定な値を使って初期化します。

この"Windowsのタイマから得られた不定な値"というのが実際どういう値になっているのか
知りたいのですが、どのようにすれば取得できるでしょうか?



この記事に返信する


shinkun

リンク

2011/3/12(Sat) 13:30:44|NO.37547

randomize のデフォルト値は WinAPI の GetTickCount の戻り値を利用しているみたいです。
以下がその確認プログラム。環境により異なる可能性もあるので確認してみてください。


#uselib "winmm.dll" #cfunc global timeGetTime "timeGetTime" #func global timeBeginPeriod "timeBeginPeriod" int #func global timeEndPeriod "timeEndPeriod" int #uselib "kernel32.dll" #cfunc global GetTickCount "GetTickCount" #module #defcfunc getDefault return GetTickCount() ;return timeGetTime() ; テストに利用するタイマを有効する ; Windows にはもうひとつくらいタイマがあった気がするけど割愛 #global mes "確認しています" repeat 1000 ; 予想されるデフォルト値を取得する t = getDefault() ; デフォルト値で初期化した乱数を取得する randomize a = rnd(10000) ; 予想されるデフォルト値で初期化した乱数を取得する randomize t b = rnd(10000) ; 両者を比較して相違が無い事を確認する if (a != b) : break wait 1 loop if (a == b) { mes "■予想は(おそらく)当たりました" } else { mes "■予想は外れました" } mes "確認終了" stop

テスト回数が 1000 回と少なく結果の信憑性に不安を覚えますが、これは wait 1 によって処理時間が膨大になる事を避けるためです。(現状でも 10 秒程度掛かります)
ちなみに wait を入れているのは、タイマの精度は 10 ms 程度であるため、これ以上速くしたところでタイマ値は変わらず意味が無いからです。
timeGetTime の精度は timeBeginPeriod/timeEndPeriod で変更出来ますが、変更せずとも randomize のデフォルト値でない事が確認出来たので敢えてしていません。
しかし、たとえ予想が合っていたとしても GetTickCount の戻り値を randomize のデフォルト値と仮定してプログラミングするのはあまりオススメ出来ません。
HSP のドキュメントでは、randomize のデフォルト値が Windows タイマを使用している事を明言していても、GetTickCount を使用しているとは言っていません。
この事はいつでもデフォルト値を設定する Windows タイマを変更できるという意味です。その環境に最適なタイマを選択するような実装になっている可能性は充分ありますし、もしかしたら次のバージョンでは timeGetTime 固定に変わっているかもしれません。
むしろ、randomize で乱数の種を設定できるのですから、自分で GetTickCount や timeGetTime などのタイマを使って randomize に設定してやる方法の方が安全で確実です。
おそらくは乱数列の再現をする目的でデフォルト値を知りたいという事でしょうから、こちらの方法をオススメします。


seed = GetTickCount() ; 保存しておけば後から何度でも再現出来る randomize seed ; これなら randomize がデフォルト値の設定に何を使っていようが関係ない



玄冬

リンク

2011/3/12(Sat) 14:52:20|NO.37549

ご回答ありがとうございます。

>おそらくは乱数列の再現をする目的でデフォルト値を知りたいという事でしょうから、こちらの方法をオススメします。

まさにその通りです。
下2行のサンプル参考にさせて頂きます。



ONION software Copyright 1997-2023(c) All rights reserved.