こんばんわ。いつもプログラミングの館にはお世話になっています。
今回リプレイ機能を実装しようと思ったのですが、乱数が通常プレイとリプレイの場合とで異なるため上手くいきません…。
rang関数を
double rang(double ang){
if(rep_flag==0)
random[rep_cnt]=GetRand(10000)/10000.0;
return ( -ang + ang*2 * random[rep_cnt] );
}
(rep_flag は0ならば通常プレイ、1ならばリプレイを再生)
とし、stage_countとは別にrep_cntというステージ開始からの時間をカウントする変数を使い、
通常プレイ時にrandomという配列に乱数を格納し、リプレイ再生時には格納されている値を用いていている
のですが、何故か通常プレイとリプレイでは値が異なります。
どうすれば通常プレイとリプレイの時に同じ値が返ってくるようにできるのでしょうか?
また、他に方法がありましたらご教授下さい。
よろしくお願い致します。
リプレイ実装の際の乱数の調整について
Re:リプレイ実装の際の乱数の調整について
乱数は乱数の種によって出る値が変わるのでリプレイファイルには乱数の種を保存しておけばいいのではないでしょうか
int seed = GetRand( 1000 );
SRand( seed );
リプレイファイルにseedを保存し、次リプレイファイル再生時にSrandに保存した乱数の種を入れてやると
以前と同じ乱数が発生するようになります
各ステージ開始時に毎回乱数の種を設定するようにすればリプレイファイルを途中のステージから再生できるので便利かと思います
もちろんDXライブラリを初期化した後すぐ時間などでSRandに乱数の種を設定するのを忘れずに
int seed = GetRand( 1000 );
SRand( seed );
リプレイファイルにseedを保存し、次リプレイファイル再生時にSrandに保存した乱数の種を入れてやると
以前と同じ乱数が発生するようになります
各ステージ開始時に毎回乱数の種を設定するようにすればリプレイファイルを途中のステージから再生できるので便利かと思います
もちろんDXライブラリを初期化した後すぐ時間などでSRandに乱数の種を設定するのを忘れずに
Re:リプレイ実装の際の乱数の調整について
回答有難うございます。nayoさんの方法で試してみました。
龍神録プログラミングの館に沿ってプログラムをしているのですが、
まず、first_ini() の中でseed=GetRand(1000)でseedに値を入れ、ini()の中でSRand(seed)で初期化しています。
そして、敵が弾を撃つ時に
double rang(double ang){
return ( -ang + ang*2 * GetRand(10000)/10000.0 );
}
を呼び出して、弾の角度を決めています。
ところが、同じseedの値で初期化しているにも関わらず弾の角度が毎回異なります…。
例えば、試しに seed=5 のように定数で実行しても毎回弾の角度が変わります。
SRandの使い方やタイミングが間違っているのでしょうか?
分かりにくい文章で申し訳ありませんが、よろしくお願い致します。
龍神録プログラミングの館に沿ってプログラムをしているのですが、
まず、first_ini() の中でseed=GetRand(1000)でseedに値を入れ、ini()の中でSRand(seed)で初期化しています。
そして、敵が弾を撃つ時に
double rang(double ang){
return ( -ang + ang*2 * GetRand(10000)/10000.0 );
}
を呼び出して、弾の角度を決めています。
ところが、同じseedの値で初期化しているにも関わらず弾の角度が毎回異なります…。
例えば、試しに seed=5 のように定数で実行しても毎回弾の角度が変わります。
SRandの使い方やタイミングが間違っているのでしょうか?
分かりにくい文章で申し訳ありませんが、よろしくお願い致します。