ページ 11

DxLibのGetRand()とstdlibのrand()の違いについて+α

Posted: 2017年9月02日(土) 22:28
by 遊び人
c言語(+DXライブラリ)にてゲームを作る際、乱数は必要不可欠です。
普段はstdlib.hのrand関数とsrand関数を用いているのですが、
DXライブラリにはGetRand関数とSRand関数があり、その違いがよく分かっておりません。
また、どちらを使用したほうが良い?のかも教えて下さい!
開発環境はVisalStudio2017を使用しており、OSはwindows10です。

【+α】
題名とは全く関係のないことですが、現在制限時間等の時間計測にはclock関数を用いています(それしか知らないのですが)。
もし他に有用な時間計測ができる方法がございましたらお教えください。

Re: DxLibのGetRand()とstdlibのrand()の違いについて+α

Posted: 2017年9月02日(土) 22:45
by Dixq (管理人)
基本的に理由がないのであればDXライブラリのGetRand()を使った方が良いです。
stdlibの乱数のアルゴリズムは環境にもよりますが、一般的にそれよりもDXライブラリの関数の方が高性能なアルゴリズムで乱数が作られていること、
更にいちいち乱数を初期化しなくても、DXライブラリの内部で適当な初期化がされているので、いつも違った値が出ます。
SRandは、リプレイ等で以前出した乱数と全く同じ乱数を生成したい時等にしか使う必要がありません。

Re: DxLibのGetRand()とstdlibのrand()の違いについて+α

Posted: 2017年9月02日(土) 22:52
by 遊び人
なるほど!GetRand関数は初期化の必要がない上にrand関数より高性能だったんですね・・・
今まで知らずに損をしておりました、ありがとうございます。

Re: DxLibのGetRand()とstdlibのrand()の違いについて+α

Posted: 2017年9月02日(土) 22:58
by Glock
既に解決していたみたいですが,原稿を書き上げてしまったのが勿体ないので投稿.

・stdlib.hのrand関数
0~32767の疑似乱数を返却する関数

・DXライブラリのGetRand関数
0~引数で渡した値の範囲で生成した疑似乱数を返却する関数


・stdlib.hのsrand関数
rand関数の種を引数の値で初期化する関数

・DXライブラリのSRand関数
GetRand関数の種を引数の値で初期化する関数(但し,引数を指定しなかった場合は,内部時計の時間で初期化)


・乱数の性能について
比較実験を行ったサイトがあるようなので参照
http://1st.geocities.jp/shift486909/pro ... iTest.html


・どちらを使うべきか?

「汎用性」「移植性」を重視するならば
stdlib.hのrand関数,srand関数に軍配が上がると思える.

DXライブラリの使用に特化したプログラミングを行う場合,
1.疑似乱数の性能が若干良さそう
2.乱数の種の初期化時に,パラメータを設定しなくても,自動で内部時計の時間で初期化してくれる
等の理由から,DXライブラリのGetRand関数,SRand関数に軍配が上がると思える.

私なら前者を優先して,stdlib.hのrand関数,srand関数を基本的に使うと思う.


>現在制限時間等の時間計測にはclock関数を用いています

どの程度のスパンや精度で時間計測を行いたのかにも依ると思います.

状況次第では,time(NULL)で,日時等を取得する事も有用な手段と言えます.

Re: DxLibのGetRand()とstdlibのrand()の違いについて+α

Posted: 2017年9月02日(土) 23:11
by 遊び人
詳しい情報をありがとうございます。
rand関数にも汎用性等でGetRand関数に勝っている部分があったんですね。
rand関数が要らない子にならなくてよかったです。

時間計測についてはやはり方法が少ないのですね・・・
GetNowCount関数?とやらもあるようですが、私はclock関数を使うことになりそうです。

Re: DxLibのGetRand()とstdlibのrand()の違いについて+α

Posted: 2017年9月03日(日) 00:03
by みけCAT
Glock さんが書きました: ・stdlib.hのrand関数
0~32767の疑似乱数を返却する関数
rand関数は0~RAND_MAX(環境依存)の擬似乱数を返します。
実際に32767を超える値を返す環境が存在します。

Re: DxLibのGetRand()とstdlibのrand()の違いについて+α

Posted: 2017年9月03日(日) 17:04
by Dixq (管理人)
DXライブラリを用いている時点で乱数生成部の移植性を重視する必要ってあるんでしょうか・・。

Re: DxLibのGetRand()とstdlibのrand()の違いについて+α

Posted: 2017年9月03日(日) 18:42
by 遊び人
ないですね(きっぱり)

Re: DxLibのGetRand()とstdlibのrand()の違いについて+α

Posted: 2017年9月03日(日) 21:05
by Glock
>DXライブラリを用いている時点で乱数生成部の移植性を重視する必要ってあるんでしょうか・・。

私はあると考えます。

------例------
DXライブラリを用いて開発中のソフトのプロジェクトに於いて、ヘッダファイルを作成した。

そのヘッダファイルは、他のソフトウェア開発においても流用可能な機能であるため、今後のソフトウェア開発における移植性を考慮してrand()で統一した方が無難だろう。
------------


Re: DxLibのGetRand()とstdlibのrand()の違いについて+α

Posted: 2017年9月04日(月) 17:11
by ISLe
オフトピック
C++11で追加された乱数ライブラリを使うと、DXライブラリのGetRandと同様のメルセンヌツイスタによる疑似乱数生成を選択できますし、また、複数のインスタンスを生成できるので、うっかりGetRand使ったらリプレイ全滅、といった事故を防ぐこともできます。

コード:

# include <iostream>
# include <random>

int main()
{
	std::random_device rd;
	std::mt19937 mt(rd());
	for(int i=0; i<10; ++i) {
		std::cout << mt() << std::endl;
	}
}