GameMaker 日本語掲示板

乱数の取得方法についてについて

2 コメント
views
17 フォロー

乱数について良く分からないので質問させていただきます。
現在作成しているゲームはターン性ゲームで、サイコロなどの運が絡む要素をいくらか含んでいます。
また、データの作成時にrandomizeを一度実行しています。
また、将棋の待ったのように、ターンを一つ前に戻せるシステムも作成しました。
そこで、例えば3ターン目開始時ににサイコロを振り、その結果が2なのなら、4ターン目以降から3ターン目に戻りまた最初にサイコロを振ったら2が出るようにしたいです。
どうにかして乱数の結果を確定させる方法はありますか?
配列などですべて保存する方法以外だとありがたいです。

program_suck
作成: 2024/07/04 (木) 21:35:52
最終更新: 2024/07/04 (木) 21:36:34
通報 ...
1
生高橋 2024/07/05 (金) 15:35:19 修正

一つ前だけに戻るのであれば、一つ前のサイコロの結果を保存するというのはどうでしょうか

2
名前なし 2024/07/05 (金) 19:32:02 修正

GameMakerで使う乱数は、「疑似乱数」となるので、乱数生成器にrandom_set_seed()で乱数の種を入れて、random()を呼ぶたびに出てくる数字の順番は毎回同じです。
random_set_seedを自発的に記述していない場合でも、内部的にrandom_set_seed(0)で乱数生成を行っているようです。

randomize() or randomise()を呼び出したときは、乱数の種に入れる数字を作り、random_set_seed()にその種を入れるようになっています。

歴史を遡って同じ乱数の値をとるためには、「データの作成時」にrandomizeを呼び出した後、random_get_seed()を使い、乱数の種を取得し、セーブデータや一時データに保管しておく。

その後、randomを使うときは、何回使ったかの回数を保管しておく。

セーブデータロードや戻るコマンド?などで3ターン目や2ターン目に戻ったときは、保管しておいた乱数の種をrandom_set_seed(種の数字)でリセットして、使った回数分randomize()呼び出しを行う。
すると、同じ乱数を取得することができます。

まとめると、

▼メイン処理
randomize()←最初の一回だけ
乱数の種変数「保管する」=random_get_seed()

▼乱数を使うとき
random(数字)
randomを呼び出した回数変数++「保管する」

▼元に戻したいとき
random_set_seed(乱数の種変数)
randomを呼び出した回数変数をループなどでまわして「random(00)」繰り返し呼ぶ
1つ前の乱数を使いたいのでループは「randomを呼び出した回数変数-1」にすればよいと思います。

保管しておくデータは
・乱数の種
・randomを呼び出した回数
だけで同じ乱数を取得できます。