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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
遊び人
記事: 32
登録日時: 11ヶ月前

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

#1

投稿記事 by 遊び人 » 9ヶ月前

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

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

アバター
Dixq (管理人)
管理人
記事: 1613
登録日時: 7年前
住所: 北海道札幌市
連絡を取る:

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

#2

投稿記事 by Dixq (管理人) » 9ヶ月前

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

遊び人
記事: 32
登録日時: 11ヶ月前

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

#3

投稿記事 by 遊び人 » 9ヶ月前

なるほど!GetRand関数は初期化の必要がない上にrand関数より高性能だったんですね・・・
今まで知らずに損をしておりました、ありがとうございます。

Glock

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

#4

投稿記事 by Glock » 9ヶ月前

既に解決していたみたいですが,原稿を書き上げてしまったのが勿体ないので投稿.

・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)で,日時等を取得する事も有用な手段と言えます.

遊び人
記事: 32
登録日時: 11ヶ月前

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

#5

投稿記事 by 遊び人 » 9ヶ月前

詳しい情報をありがとうございます。
rand関数にも汎用性等でGetRand関数に勝っている部分があったんですね。
rand関数が要らない子にならなくてよかったです。

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

アバター
みけCAT
記事: 6013
登録日時: 7年前
住所: 千葉県
連絡を取る:

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

#6

投稿記事 by みけCAT » 9ヶ月前

Glock さんが書きました: ・stdlib.hのrand関数
0~32767の疑似乱数を返却する関数
rand関数は0~RAND_MAX(環境依存)の擬似乱数を返します。
実際に32767を超える値を返す環境が存在します。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
Dixq (管理人)
管理人
記事: 1613
登録日時: 7年前
住所: 北海道札幌市
連絡を取る:

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

#7

投稿記事 by Dixq (管理人) » 9ヶ月前

DXライブラリを用いている時点で乱数生成部の移植性を重視する必要ってあるんでしょうか・・。

遊び人
記事: 32
登録日時: 11ヶ月前

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

#8

投稿記事 by 遊び人 » 9ヶ月前

ないですね(きっぱり)

Glock

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

#9

投稿記事 by Glock » 9ヶ月前

>DXライブラリを用いている時点で乱数生成部の移植性を重視する必要ってあるんでしょうか・・。

私はあると考えます。

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

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


ISLe
記事: 2618
登録日時: 7年前
連絡を取る:

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

#10

投稿記事 by ISLe » 9ヶ月前

オフトピック
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;
	}
}

返信

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