リプレイ実装の際の乱数の調整について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
mugi

リプレイ実装の際の乱数の調整について

#1

投稿記事 by mugi » 16年前

こんばんわ。いつもプログラミングの館にはお世話になっています。

今回リプレイ機能を実装しようと思ったのですが、乱数が通常プレイとリプレイの場合とで異なるため上手くいきません…。
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という配列に乱数を格納し、リプレイ再生時には格納されている値を用いていている
のですが、何故か通常プレイとリプレイでは値が異なります。

どうすれば通常プレイとリプレイの時に同じ値が返ってくるようにできるのでしょうか?
また、他に方法がありましたらご教授下さい。
よろしくお願い致します。

nayo

Re:リプレイ実装の際の乱数の調整について

#2

投稿記事 by nayo » 16年前

乱数は乱数の種によって出る値が変わるのでリプレイファイルには乱数の種を保存しておけばいいのではないでしょうか

int seed = GetRand( 1000 );
SRand( seed );

リプレイファイルにseedを保存し、次リプレイファイル再生時にSrandに保存した乱数の種を入れてやると
以前と同じ乱数が発生するようになります
各ステージ開始時に毎回乱数の種を設定するようにすればリプレイファイルを途中のステージから再生できるので便利かと思います
もちろんDXライブラリを初期化した後すぐ時間などでSRandに乱数の種を設定するのを忘れずに

mugi

Re:リプレイ実装の際の乱数の調整について

#3

投稿記事 by mugi » 16年前

回答有難うございます。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の使い方やタイミングが間違っているのでしょうか?
分かりにくい文章で申し訳ありませんが、よろしくお願い致します。

mugi

Re:リプレイ実装の際の乱数の調整について

#4

投稿記事 by mugi » 16年前

解決しました。初期化に問題があったようです。
有難うございました。

閉鎖

“C言語何でも質問掲示板” へ戻る