Re: 起動直後のGetRand(1000000)が0を返す ( No.1 ) |
- 名前:Dixq 日時:2017/03/29 23:41
公開しておりますソースコードのUtilsクラスの以下の部分を変更し
static int i = 1;
float Utils::randf(float val) {
int r = GetRand(1000000);
if(i<630)
printfDx("%d:%d\n",i,r);
i++;
return r / 500000.f * val - val;
}
スクリーンショットを撮影したのが以下のようになります。
624回までは0になります。
dixq.net/private/ss/dx.jpg
|
Re: 起動直後のGetRand(1000000)が0を返す ( No.2 ) |
- 名前:Sura 日時:2017/03/30 02:06
横レス失礼します。
メルセンヌ・ツイスターは、623次元で均等分布するようです。
※ 最初の値をX座標、次の値をの値をY座標、もう次の座標をZ座標とすると3次元の座標が得られる。
このような要領で623回続けて出した乱数を623次元の座標として点を打つと、全空間万遍なく埋め尽くす。
ですから、どの値でも(0〜2^32-1の内の何れかの値)続けて同じ値が623回出る乱数列が存在するようです。
恐らく仕様ではないかと?
ちなみに、真の乱数は無限に同じ数が出ることを禁止する制約はないので、
それを以て、(偶々)極めて規則的に見えるが乱数ではないと否定できません。
つまり、真の乱数とは出鱈目っぽく見えるのは、あくまで全体(無限)事象を観たときの話であって、
極めて僅かではありますが、規則的な長い数列の範囲が無限であるところも存在します。
ですから、良い乱数であればあるほど、その範囲も長くなるという事です。
尤も、このような乱数を「乱数」と感じるかどうか別問題で、
ゲームとして使う理想の「乱数」は、真の乱数が理想なのか、短周期な質の悪い疑似乱数のほうが良いのか
判断する必要があると思います。
|
Re: 起動直後のGetRand(1000000)が0を返す ( No.3 ) |
- 名前:管理人 日時:2017/04/02 14:28
ご指摘ありがとうございます
Windows版DXライブラリでは DxLib_Init の中で SRand( GetNowCount() ); を実行して
GetRandで得られる乱数の処理の初期化を行っているのですが、Android版ではその処理を行っていませんでした
Android版でも初期化処理を行うように修正したバージョンをアップしましたので、よろしければお使いください m(_ _;m
https://dxlib.xsrv.jp/temp/DxLibAndroidTest_ARM.exe // Android版 ARM用
> Suraさん
メルセンヌ・ツイスターのアルゴリズム上 623回連続で乱数が 0 になる可能性はあると思いますが、
少なくとも本件は仕様に因るものではなく初期化忘れが原因でした orz
|
Re: 起動直後のGetRand(1000000)が0を返す ( No.4 ) |
- 名前:Dixq 日時:2017/04/21 08:30
管理人さん
御対応ありがとうございます。
原因が分かってよかったです。
|