web-dev-qa-db-ja.com

srand()を使用したランダムウォークでバタフライパターンが表示されるのはなぜですか?

約3年前に、同僚と2DランダムウォークトゲッターをC++でコーディングしました。最初は毎回異なるパターンを取得したため、正しく機能するように見えました。しかし、ステップ数をいくつかのしきい値を超えて増やすことを決定したときはいつでも、明らかなバタフライパターンが現れました。その結果、srand()関数に関連付けられた疑似乱数ジェネレーターが原因であると結論付けて報告しましたが、今日再びこの報告を見つけましたが、まだ理解したいことがいくつかあります。この種の対称性とciclicパターンを得るために、疑似乱数ジェネレータがどのように機能するかをよりよく理解したいと思います。私が話しているパターンはこれです(歩の進行を正確にするために、手順はレインボーシーケンスで色分けされています)。

enter image description here

編集:

この図を取得するために使用したコードを追加します。

#include<iostream>
#include<cmath>
#include<stdlib.h>
#include<time.h>
#include <fstream>
#include <string.h>
#include <string>
#include <iomanip>

using namespace std;

int main ()
{
srand(time(NULL));
int num1,n=250000;



ofstream rnd_coordinates("Random2D.txt");
float x=0,y=0,sumx_f=0,sumy_f=0,sum_d=0,d_m,X,t,d;
float x_m,y_m;

x=0;
y=0;

for(int i=0;i<n;i++){

    t=i;
    num1= Rand()%4;

    if(num1==0){
        x++;
    }
    if(num1==1){
        x--;
    }
    if(num1==2){
        y++;
    }
    if(num1==3){
        y--;
    }

    rnd_coordinates<<x<<','<<y<<','<<t<<endl;

}

rnd_coordinates.close();


return 0;
}
11

古いRand()の実装について、別の質問 here に対する私の回答を確認することをお勧めします。古いRand() and srand()関数では、下位ビットが上位ビットよりもランダムでない場合があります。これらの古い実装の一部は引き続き存続します。使用した可能性があります。

0
Thomas Kammeyer