web-dev-qa-db-fra.com

Le motif papillon apparaît dans une marche aléatoire en utilisant srand (), pourquoi?

Il y a environ 3 ans, j'ai codé une marche aléatoire 2D avec un collègue en C++, d'abord cela semblait fonctionner correctement car nous obtenions un modèle différent à chaque fois. Mais chaque fois que nous décidions d'augmenter le nombre de pas au-dessus d'un certain seuil, un motif papillon apparent apparaissait, nous avons remarqué qu'à chaque exécution du code, le motif se répétait mais en commençant à un endroit différent du papillon. Nous avons conclu et signalé alors que c'était dû au générateur pseudo-aléatoire associé à la fonction srand (), mais aujourd'hui j'ai retrouvé ce rapport et il y a encore des choses que j'aimerais comprendre. J'aimerais mieux comprendre comment fonctionne le générateur pseudo-aléatoire pour obtenir ce genre de symétrie et de motif ciclique. Le modèle dont je parle est le suivant (les étapes sont codées par couleur dans une séquence arc-en-ciel pour apprécier la progression de la marche):

enter image description here

ÉDITER:

J'ajoute le code utilisé pour obtenir ce chiffre:

#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
Isidre Mas Magre

Vous voudrez peut-être regarder ma réponse à une autre question ici sur les implémentations plus anciennes de Rand(). Parfois, avec les anciennes fonctions Rand() and srand(), les bits d'ordre inférieur sont beaucoup moins aléatoires que les bits d'ordre supérieur. Certaines de ces implémentations plus anciennes persistent, il est possible que vous en ayez utilisé une.

0
Thomas Kammeyer